Я запускаю это:
ssh root@192.168.88.88 '/etc/init.d/networking restart'
Он работает и выводит результаты, но никогда не возвращается. Все же другие команды делают. Возможно, потому что сеть выходит из строя (как и предполагалось). Как я могу прекратить это? Я попытался добавить команду выхода, но без кубиков.
ОБНОВЛЕНИЕ: я заметил, что иногда это работает. Кажется, проблема возникает, если процесс прерывается, а конфигурация удаленного интерфейса находится в неизвестном состоянии. Я до сих пор не могу отследить, что именно привело к зависанию.
Возможно, команда restart прерывается при потере соединения (на первый взгляд, запрос системы перезапустить сетевое соединение по сети кажется опасным). Что бы вы хотели, чтобы networking restart
работал независимо от управляющего терминала. Я бы добавил запись в crontab вот так (возможно, поместите ее в /etc/cron.d/checker-thingy
):
* * * * * root /path/to/checker-thingy.sh
, тогда checker-thingy.sh будет выглядеть примерно так:
[ -f /tmp/restart-network ] && service networking restart
[ -f /tmp/restart-network ] && rm /tmp/restart-network
Это Это ужасно и склонно к другим проблемам, но в основном, как вы видите, он перезапустит сеть, если найдет определенный файл флага в /tmp
(а затем удалит файл, чтобы избежать петли сброса сети).
Затем в вашем автоматическом скрипте вы можете сделать:
ssh server-ip 'touch /tmp/restart-network'
и через минуту или около того вы должны увидеть цикл сетевого интерфейса в соответствии с запросом.
Я наткнулся на эту очень интересную страницу: http://mywiki.wooledge.org/BashFAQ/063 . Команда ssh
находится в ожидании закрытия выходных потоков удаленного процесса, поэтому она будет перехвачена при закрытии сети.
Итак (проверено):
ssh user@host "sleep 60 &"
вернется через 60 секунд, тогда как
ssh user@host "sleep 60 >/dev/null 2>&1 &"
вернется сразу после запуска команды sleep
в фоновом режиме.
Если это правильно, решение будет состоять в том, чтобы немедленно отключить стандартный вывод и ошибку от удаленной оболочки - вот так (не проверено, пожалуйста, проверьте):
ssh user@host '/etc/init.d/networking restart >/dev/null 2>&1 &'
или если это все еще вызывает гонку между разрушением сети и закрытием оболочки,
ssh user@host '(sleep 10 && /etc/init.d/networking restart ) >/dev/null 2>&1 &'
должны работать.
Удалите пакет shh, набрав
и переустановите его: