Почему autossh порождает десятки экземпляров себя и ssh? - PullRequest
0 голосов
/ 06 июля 2019

Я запускаю autossh на Mac (Mavericks) из сценария оболочки bash, контролируемого launchd. К сожалению, из-за того, как я это настроил, autossh порождает десятки экземпляров себя и ssh. В конце концов оболочка перестает работать, и удаленные подключения становятся невозможными. Если я убью все, autossh и ssh вернутся в нормальное состояние.

Это на хосте:

Axe:~ mnewman$ ps -A | grep -c -w ssh
41
Axe:~ mnewman$ ps -A | grep -c -w autossh
152

Это на клиенте:

MrMuscle:~ mnewman$ ssh -p19990 mnewman@localhost
Last login: Sat Jul  6 16:19:50 2019 from localhost
-bash: fork: Resource temporarily unavailable
-bash-3.2$

Мне потребовалось много времени, чтобы запустить это. Пока что я понятия не имею, как выяснить, что здесь происходит.

Сценарий оболочки:

#!/bin/bash

/opt/local/bin/autossh -f -M 0 -N -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -o ServerAliveCountMax=2 -R 19990:localhost:22 mnewman@korat.myddns.rocks -p 10000 

Запущенный файл plist, находящийся в ~ / Library / LaunchAgents:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Debug</key>
    <false/>
    <key>Disabled</key>
    <false/>
    <key>EnvironmentVariables</key>
    <dict>
        <key>PATH</key>
        <string>/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
</string>
    </dict>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>com.mgnewman.autossh</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/mnewman/bin/autossh.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/Users/mnewman/Desktop/autossh.txt</string>
    <key>StandardOutPath</key>
    <string>/Users/mnewman/Desktop/autossh.txt</string>
    <key>WorkingDirectory</key>
    <string>/Users/mnewman/Documents</string>
</dict>
</plist>

Что я сделал здесь, чтобы породить так много случаев autossh и ssh?

1 Ответ

0 голосов
/ 06 июля 2019

Понятно, что не требуется поддерживать сценарий живым, но ssh.
Опять же, это то, для чего используется autossh (для автоматического переподключения ssh-соединения при разрыве).

Установите KeepAlive на false
или, если все еще требуется, вы можете настроить его, как показано ниже:

<key>KeepAlive</key>
<dict>
     <key>SuccessfulExit</key>
     <false/>
</dict>

Кроме того, хорошо добавить строку exit 0 вконец сценария.

Наконец, если это единственная цель скрипта, запустить autossh, рассмотрите возможность добавления autossh в launchd.


plist файл с autossh
(у меня нет среды для тестирования, но она должна работать.)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Debug</key>
    <false/>
    <key>Disabled</key>
    <false/>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>com.mgnewman.autossh</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/local/bin/autossh</string>
        <string>-M</string>
        <string>0</string>
        <string>-N</string>
        <string>-o</string>
        <string>ExitOnForwardFailure=yes</string>
        <string>-o</string>
        <string>ServerAliveInterval=30</string>
        <string>-o</string>
        <string>ServerAliveCountMax=2</string>        
        <string>-R</string>
        <string>19990:localhost:22</string>
        <string>mnewman@korat.myddns.rocks</string>
        <string>-p</string>        
        <string>10000</string>        
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/Users/mnewman/Desktop/autossh.txt</string>
    <key>StandardOutPath</key>
    <string>/Users/mnewman/Desktop/autossh.txt</string>
    <key>WorkingDirectory</key>
    <string>/Users/mnewman/Documents</string>
</dict>
</plist>  

Изменения:
Помещает autossh в качестве аргумента программы для каждого фрагмента аргумента, за исключением -f (для отправки в фоновом режиме), который больше не нужен.
Пропущена переменная окружения PATH, поскольку у нас есть autossh с полным путем.

Добро пожаловать.

...