как сменить каталог и раскрутить процесс

309
Legit Stack

Я знаю, как изменить каталог:

cd path

Я знаю, как отделить процесс:

command &, nohup command > /tmp/test_output.txt 2>&1 &, nohup command > /dev/null 2>&1 &, disown command &

Вот хорошая ссылка для этого: Как мне полностью отключить процесс от терминала?

Но я не знаю, как сделать их одновременно, это кажется невозможным. Может кто-нибудь мне помочь? Вот несколько вещей, которые я пробовал:

path/command nohup cd path && command > /tmp/test_output.txt 2>&1 & cd path && nohup command > /tmp/test_output.txt 2>&1 & cd path && disown command & (cd path && disown command &) (cd path && command) & cd path ; command & 

Я могу получить это по ошибке, я могу заставить его перейти по этому пути и запустить (но не отсоединенный от моего терминала), или я могу заставить его запускать команду, отсоединенную от моего терминала, но в моем текущем рабочем каталоге, а не в пути cd ,

Я не могу заставить его отключить процесс от моего терминала и одновременно запустить команду из другого каталога, чем мой.

ты можешь помочь мне с этим? Это вообще возможно?

0

1 ответ на вопрос

2
Kamil Maciorowski

Есть различия между 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процесса, поэтому, в общем, имеет значение, используете ли вы cdbefore nohup( cd path && nohup ...) или наоборот ( nohup sh -c 'cd path ... ').

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