Я хочу написать скрипт bash, который может подключаться к серверу по ssh, запускать непрерывный фоновый процесс (бесконечный скрипт python) и выходить с сервера. Вот что я пробовал:
ssh user@domain "python3 script.py &"
ssh user@domain "python3 script.py & exit"
ssh user@domain "nohup python3 script.py & exit"
Ни один из них не работает. Скрипт успешно запускается, но я не могу выйти с сервера, и он остается в системе.
решение1
Команда nohup
не делает то, что вы думаете: она игнорирует сигнал зависания, так что (терминальные) соединения на STDIO могут быть разорваны без отправки драйвером терминала данных SIGHUP
присоединенным процессам, но nohup
не закрывает свои собственные соединения STDIO, а фактически передает их процессу, который она запускает, и, таким образом, sshd
будет ждать, пока процесс не завершится и эти дескрипторы в результате не будут закрыты.
Поэтому вам нужно убедиться, что процесс, который вы запускаете, также не подключен к дескрипторам STDOUT и STDERR, предоставленным ему sshd
(STDIN уже открыт на /dev/null
), и вы можете сделать это, перенаправив их (либо в файл, либо в /dev/null
). nohup
Команда не является строго необходимой, так как ничего не будет отправлено SIGHUP
, когда соединение SSH прервется.
Попробуй это:
ssh user@domain "python3 script >/dev/null 2>&1 &"
решение2
Попробуйте терминальный мультиплексор, tmux великолепен. Обычно я не люблю давать советы, где вам, возможно, придется что-то устанавливать, но tmux — это действительно удобное приложение, которое стоит иметь в своем арсенале. (возможно, оно уже установлено)
Вы можете запустить свое приложение, завернутое в tmux, отсоединиться, закрыть свой ноутбук, перейти куда-нибудь еще, войти снова и снова подключиться к сеансу, все еще работающему в tmux. Если ваша ОС старая, экран делает то же самое, но я предпочитаю tmux.
вы можете запустить новое приложение из командной строки или приложение, отформатированное следующим образом
tmux новый сеанс "команда1"
tmux new-session "ping 8.8.8.8"
Но вам, вероятно, следует назвать свои сессии. Теперь сократите новую сессию с именем muxping, которая запускается в фоновом режиме. -d отсоединяется.
tmux new -d -s muxping "ping 8.8.8.8"
теперь покажи это в фоновом режиме
tmux ls
прикрепить к нему
tmux a
Кроме того, вы можете разделить экран и делать много очень удобных вещей в tmux. Существует много сайтов с шпаргалками по tmux, которые упрощают большую страницу руководства. Довольно легко начать.