Есть различия между nohup
, disown
и&
(вы также можете найти этот ответ интересным).
Синтаксис, который disown command
вы использовали, недопустим, по крайней мере, в Bash; см help disown
. В некоторых случаях command & disown
достаточно, но
[
command
] по-прежнему подключен к терминалу, поэтому, если терминал уничтожен [...], программа завершится ошибкой, как только она попытается выполнить чтение со стандартного ввода или запись в стандартный вывод.
Так nohup command &
кажется лучше, однако
nohup
не удаляет процесс из управления работой оболочки
Это кажется довольно безобидным, но если это беспокоит вас, просто disown
работа:
nohup command & disown
Но если работа прекращается до того, как disown
вы начнете действовать, вы откажетесь от другой работы (если она есть). Правильный способ сделать это в Bash - использовать$!
:
$!
Расширяет до идентификатора процесса задания, недавно помещенного в фоновый режим.
Так что это лучше
nohup command & disown $!
(Так как disown
после nohup
это в основном косметические, я буду опускать его с этого момента . Используйте его, если вам это нужно).
Чтобы cd
раньше command
не затрагивать текущую оболочку, лучше всего сделать это в подоболочке (вы пробовали, но не с nohup
):
(cd path && nohup command) &
или даже
(cd path && exec nohup command) &
где exec
заставляет nohup
заменить процесс подоболочки, который больше не нужен; nohup
будет заменен на, command
потому что так работает инструмент. Таким образом, вы получите один процесс вместо многих.
В качестве альтернативы вы можете nohup
всю оболочку. Это позволяет вам выполнять несколько команд:
nohup sh -c 'cd path || exit; command1; command2' &
(В этом случае exec
имеет смысл только раньше command2
).
Примечание nohup
создает файл nohup.out
, если вы не перенаправите его вывод (см. man 1 nohup
). Место создания файла зависит от текущего рабочего каталога nohup
процесса, поэтому, в общем, имеет значение, используете ли вы cd
before nohup
( cd path && nohup ...
) или наоборот ( nohup sh -c 'cd path ... '
).