
У меня есть 2 хоста, которые я могу подключить через SSH. На одном хосте через некоторое время появляется ошибка. Write Failed: broken pipe.
На другом хосте этой ошибки нет.
Я не понимаю, почему на одном хосте у меня возникает эта проблема, а на другом все в порядке.
Итак, я установил SSH-соединение с tmux, и внутри удаленного хоста я запускаю процесс переднего плана (celeryd). Но даже когда сеанс SSH терпит неудачу, и я снова подключаюсь к прерванному сеансу, процесс переднего плана умирает.
Я бы хотел, чтобы процесс переднего плана не останавливался при разрыве SSH-соединения. Поэтому у меня есть только 2 решения:
- знать, как избежать поломок SSH-каналов, или
- знать, как избежать завершения процесса при обрыве SSH-соединения.
Кто-нибудь может мне помочь в этом вопросе?
решение1
Я не знаю, что происходит с вашим SSH-подключением, но, вероятно, это плохое сетевое соединение? Вы можете попробовать использоватьМОШ, что более надежно, чем обычное SSH-подключение. Особенно, если проблема в сети.
Если вы не можете исправить соединение, вы можете попробовать использовать nohup
перед вашей командой или просто nohup tmux
и посмотреть, изменится ли что-нибудь.
nohup - выполнить команду, устойчивую к зависаниям, с выводом на не-tty
СИНТАКСИС
nohup КОМАНДА [ARG]...
nohup ПАРАМЕТР
решение2
Я сталкивался с этой проблемой всего несколько раз. Для меня причиной поломки трубы был отсутствующий маршрут. Это происходило только при подключении физической машины в основной сети к виртуальной машине в другой сети за NAT.
Я бы проверил наличие проблем с сетью, чтобы посмотреть, сможете ли вы предотвратить возникновение обрывов труб.
Если вы не можете найти причину проблемы, вы можете использовать что-то вроде screen или tmux, чтобы держать терминал открытым, даже если вы отключены. Затем вы можете переподключиться и подключиться к сеансу screen или tmux, и ваш процесс все еще будет запущен и активен.
решение3
Наиболее распространенной причиной разрывов соединения ssh для меня было отсутствие keep-alives. Это можно настроить в клиенте ssh. С ssh это будет "-oTCPKeepAlives=yes"
что касается программ, запущенных после закрытия ssh, когда вы запускаете программу в оболочке, это дочерний процесс экземпляра оболочки. Как только он закрывается, дочерние процессы тоже закрываются. Вы можете попробовать запустить свою программу с & в конце, что породит другой процесс. Я только что провел быстрый тест, и процесс, похоже, продолжается после отключения ssh-соединения.