Альтернативы 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 &

Тебе следует:

  1. Используйте nohup, чтобы предотвратить уничтожение процесса при выходе.
  2. Перенаправьте stdout и stderror из выходных потоков терминала (в противном случае ваш процесс остановится, когда выходные потоки терминала будут уничтожены при выходе из терминала)
  3. Поместите процесс в фоновый режим (это завершающий амперсанд)
Другие вопросы по тегам