Альтернативы nohup?
У меня есть скрипт init.d, который я хочу, чтобы он работал в фоновом режиме, даже когда я выходил из терминала. Однако я попытался заставить его работать в фоновом режиме с nohup
но не было никакой надежды, потому что, когда я ушел, глядя на pstree
Я вижу, что PID исчезает и, таким образом, nohup
перестает работать
Q: есть ли другой, кроме nohup
способ подтолкнуть сценарий, который работает на переднем плане на задний план, даже после выхода из терминала?
6 ответов
Итак, есть несколько вариантов:
disown
Вы можете объединить disown
а также &
отодвинуть ваш скрипт на задний план
$ disown [your_script] &
[your_script]
может быть проверен jobs
команда. После ввода вы увидите:
$ jobs
[1]+ Running [your_script]
И убийство может быть сделано kill %1
, 1
относится к номеру работы, указанному выше.
Это лучшая альтернатива nohup
как это не покидает nohup.out
файлы засорены по всей файловой системе.
screen
Это "виртуальный" терминал, который вы можете запускать с "реального" терминала (фактически все терминалы сегодня являются "виртуальными", но это еще одна тема для другого дня). Screen
продолжит работу, даже если ваш ssh-сеанс будет отключен. Любой процесс, который вы запускаете в screen
сеанс будет продолжаться с этим сеансом экрана. При повторном подключении к серверу вы можете подключиться к сеансу экрана, и все будет так, как будто ничего не произошло, кроме прошедшего времени.
Отличный источник: Speaking UNIX: оставайся в живых с Screen ".
Вот "волшебная" команда (пояснение ниже):
thecommand &>/dev/null &
thecommand
очевидно это команда.&>/dev/null
перенаправляет весь вывод команды в черную дыру.&
запускает процесс в фоновом режиме.
Я не могу полностью понять вашу проблему, но...
В моем случае я использую screen
для таких длительных фоновых заданий. Он предоставляет виртуальный терминал, который можно подключить / отсоединить в любое время. Поэтому я могу выйти из исходного сеанса, не закрывая виртуальный сеанс, и получить этот сеанс обратно в любое время, когда захочу.
Во всяком случае, это не для сценариев в стиле init.d.
Использование &
после вашей команды в сценарии, как:
your command here > /dev/null 2>&1
exit
Я должен запустить длинную команду (rsync) через SSH (на NAS QNAP). На этой машине нет ни nohup, ни установленного экрана. Я хотел бы иметь возможность выполнять команду без необходимости постоянно поддерживать мой ноутбук с запущенным ssh-клиентом. Предлагаемые здесь ответы с фоном или амперсандом (&) просто не работают. Люди могут не знать, что nohup фактически защищает процесс от прерываний SIGINT и SIGTERM. Поэтому без nohup я получаю следующую ошибку при отключении сеанса SSH:
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(553) [receiver=3.0.7]rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(553) [generator=3.0.7]
Так что в моем случае сетсид помог вместо nohup.
nohup your_command_here > /dev/null 2>&1 &
Тебе следует:
- Используйте nohup, чтобы предотвратить уничтожение процесса при выходе.
- Перенаправьте stdout и stderror из выходных потоков терминала (в противном случае ваш процесс остановится, когда выходные потоки терминала будут уничтожены при выходе из терминала)
- Поместите процесс в фоновый режим (это завершающий амперсанд)