Назад | Перейти на главную страницу

Выполнение длительной команды по ssh

я 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. Если вы хотите использовать такой подход.