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

10

Я вхожу sshв сервер, и я запускаю скрипт Python, который займет ок. 24 часа до завершения. Что, если мое интернет-соединение умирает посередине? Это остановит команду?

Есть ли способ выполнить мою длительную команду так, чтобы локальные разъединения не повлияли на нее, и я мог бы продолжать видеть ее вывод после того, как sshснова войду в систему ?

Рам Рахум
источник

Ответы:

29

Лучший способ - использовать screen(на сервере), чтобы запустить сеанс для запуска команды, а затем отключить экран, чтобы он продолжал работать, и вы могли выполнять другие действия или просто отключаться от сервера. Другой вариант заключается в использовании nohupв сочетании с &так что вы быnohup <command> &

Zypher
источник
Экран. Или вы можете настроить задачу cron, если вы запускаете ее несколько раз.
xeon
2
Если вы отключитесь, пока он работает на экране, screen -rвы снова подключитесь.
dpflug
2

Вы также можете использовать, disownесли вы уже начали процесс без screenилиnohup

Роберт Суишер
источник
2

Существующие ответы могут хорошо работать, но мне нужно что-то для 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, bash и т. Д.

кор
источник
1

Если вы справитесь с процессом и закроете сеанс, процесс будет принят 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 . Если вы хотели принять такой подход.

user51359
источник