я ssh
в сервер, и я запускаю сценарий Python, который займет ок. 24 часа на выполнение. Что, если мое подключение к Интернету прервется посередине? Это остановит команду?
Есть ли способ запустить мою длительную команду таким образом, чтобы локальные разъединения не влияли на нее, и я мог бы продолжать видеть ее вывод после входа в систему ssh
очередной раз?
Лучше всего использовать screen
(на сервере), чтобы запустить сеанс для запуска команды, а затем отключить экран, чтобы он продолжал работать, и вы могли делать другие вещи или просто отключиться от сервера. Другой вариант - использовать nohup
в комбинации с &
так что у вас будет nohup <command> &
Вы также можете использовать disown
если вы уже начали процесс без screen
или nohup
Существующие ответы могут работать хорошо, но мне нужно что-то для BusyBox (оболочка и набор инструментов для минимального оборудования, такого как домашние маршрутизаторы). В моей системе нет screen
, dtach
, at
, disown
, или даже nohup
! Итак, спасибо tbc0 на SO (ссылка на сайт), Я нашел эту жемчужину. Он немедленно возвращается, но серверный процесс продолжает работать:
ssh myserver 'sleep 100 >&- 2>&- <&- &'
Или, если необходимо несколько команд:
ssh myserver '(echo one; sleep 100; echo two; sleep 200) >&- 2>&- <&- &'
Пояснение:
>&-
- закрыть дескриптор стандартного вывода2>&-
- закрыть stderr<&-
- закрыть стандартный ввод&
- поместить процесс в фоновый режимЭто не использует внешних программ и должно работать с ksh, ash, Bourne shell, bash и т. Д.
Если вы фоновый процесс и закрываете сеанс, процесс будет принят init (PID 1).
Если у меня есть сеанс и я делаю:
]$ sleep 10000 &
]$ exit
и откройте другой сеанс и запустите:
]$ ps -ef | grep sleep
501 26387 1 0 16:37 ? 00:00:00 sleep 10000
root 26422 21360 0 16:40 pts/0 00:00:00 grep sleep
Мой процесс все еще работает, и мы видим, что его родительский процесс теперь равен 1 (init).
В качестве альтернативы вы можете настроить свой скрипт как демон. Быстрый поиск открывает эту, казалось бы, полезную ссылку: http://onlamp.com/python/pythoncook2/solution.csp?day=1. Если вы хотите использовать такой подход.