Альтернативы nohup?

У меня есть скрипт init.d, который я хочу, чтобы он работал в фоновом режиме, даже когда я выходил из терминала. Однако я пытался заставить его работать в фоновом режиме с nohup, но у меня не было «никакой надежды», потому что когда я выходил, глядя на pstree, я вижу, что ПИД исчезает и, таким образом, nohup перестает работать.

В: Есть ли другой способ, кроме nohup, выдвинуть скрипт, который работает на переднем плане на задний план, даже после выхода из терминала?

5
задан 25 March 2015 в 05:43

6 ответов

Хорошо, таким образом, существует несколько опций:

  • disown

Можно объединиться disown и & продвигать Ваш сценарий к фону

$ disown [your_script] &
[your_script] может быть проверен jobs команда. После того, как введенный Вы будете видеть:

$ jobs
[1]+ Running [your_script]

И уничтожение может быть сделано kill %1, 1 относится к числу задания, замеченному выше. Это - лучшая альтернатива nohup поскольку это не уезжает nohup.out файлы замусорены на всем протяжении файловой системы.

  • screen

"Виртуальный" терминал, который можно выполнить от "реального" терминала (на самом деле, все терминалы сегодня являются "виртуальными", но это - другая тема в течение другого дня). Screen будет продолжать бежать, даже если Ваша ssh сессия будет разъединена. Любой процесс, который Вы запускаете в a screen сессия будет продолжать бежать с той экранной сессией. Когда Вы снова соединяетесь с сервером, можно снова соединиться с экранной сессией, и все будет то, как будто ничего не произошло кроме времени, которое передало.

Превосходный источник: Говорящий UNIX: Сидячая забастовка', изобилующая Экраном".

4
ответ дан 25 March 2015 в 05:43

Вот "волшебная" команда (объяснение ниже):

thecommand &>/dev/null &
  • thecommand, очевидно, команда.
  • &>/dev/null перенаправления весь вывод команды к черной дыре.
  • & выполнения процесс в фоновом режиме.
4
ответ дан 25 March 2015 в 05:43

Используйте & после Вашей команды в сценарии как:

your command here > /dev/null 2>&1
exit
2
ответ дан 25 March 2015 в 05:43

Я не могу отлично понять Вашу проблему, но...

В моем случае, я использую screen для таких длительных фоновых заданий. Это обеспечивает виртуальный терминал, который является attachable/dettachable в любое время. Таким образом, я могу выйти из системы от исходной сессии, не закрыв виртуальный сеанс и вернуть ту сессию каждый раз, когда я хочу.

так или иначе, это не для сценариев стиля init.d.

1
ответ дан 25 March 2015 в 05:43

Я должен выполнить длительную команду (rsync) через SSH (на QNAP nas). Та машина не имеет nohup, ни экрана установленными. Я хотел бы смочь выполнить команду без потребности сохранить мой ноутбук с ssh клиентом, работающим все время. Ответы, предложенные здесь с фоном или амперсандом (и) просто, не работают. Люди не могли бы знать, что nohup на самом деле экранирует процесс для прерываний SIGTERM и SIGINT. Таким образом без 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]

Таким образом в моем случае setsid помог вместо nohup.

0
ответ дан 23 November 2019 в 08:52
nohup your_command_here  > /dev/null 2>&1 &

Вам необходимо:

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

Другие вопросы по тегам:

Похожие вопросы: