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

Как запустить скрипт через SSH, который не заканчивается, когда я закрываю соединение?

Мне нужно запустить скрипт, на выполнение которого уходит много времени, или я просто хочу, чтобы он работал вечно. Я не могу подключиться к своей машине по SSH, потому что, когда я отключаюсь, она перестает работать.

Есть ли способ запустить сценарий, не зависящий от запущенной оболочки?

Я использую Ubuntu 9.04.

Вы можете запустить команду с командой nohup перед ней. Вы также можете запустить его на «экране», что позволит вам повторно подключить терминал.

Например:

ssh mySever 'nohup bash myscript.sh'

Или просто введите ssh и запустите команду nohup. Он должен продолжать работать даже после отключения. Это потому, что nohup будет перехватывать сигнал SIGHUP (зависание).

Экран немного сложнее, но за 20 минут, которые вам могут потребоваться, чтобы изучить основы, это один из самых полезных инструментов. Вот учебник.

Я всегда использую nohup. Если мне важен вывод, я перенаправляю его в файл журнала, в противном случае я отправляю его в / dev / null.

Пример:

nohup scp file.tar.gz root@someserver:/var/tmp > /dev/null 2>&1 &

Это помещает его в фоновый режим с выводом на / dev / null, и он невосприимчив к сигналу HUP, если вы выходите из системы. Вы также можете "отказаться" от задания с помощью определенных командных интерпретаторов (например, bash), чтобы оно не было связано с вашим сеансом.

disown %1

Чтобы установить экран: apt-get install screen

Затем запустите просто: screen

И man screen получить привязку ключа.

Когда вы вошли на сервер, вы можете запустить сценарий в автономном режиме с помощью следующей команды:

nohup script >script.out 2>script.err &

Позже, когда вы снова войдете в систему, вы можете проверить script.out на наличие любых выходных данных и script.err на наличие сообщений об ошибках. Если вы хотите, чтобы вывод и сообщения об ошибках были в одном файле, выполните:

nohup script >script.out 2>&1 &

Интересный факт: Имя команды nohup происходит от "зависания", например, когда (конечно, "черный, поворотный" ...) телефон на свой телетайп со скоростью 110 бод после извлечения гарнитуры из мягкого держателя. Обычно, когда Unix обнаруживает, что вы "повесили трубку", он отправляет SIGHUP сигнал к процессу.

Если вам нужно что-то, что можно запускать из клиента в неинтерактивном режиме, попробуйте следующее:

ssh user@host 'command >out.log 2>err.log &'

Например:

$ ssh user@host '(while true; do date; sleep 1; done) >/tmp/dates &'
$ ssh user@host
...
user@host$ tail -f /tmp/dates
user@host$ ps -ef | grep dates

Однако обратите внимание, что если вы не перенаправляете вывод в файлы, вызов ssh не завершится, пока не завершится команда.