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

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 ,

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

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

1 ответ1

2

Существуют различия между 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 before без влияния на текущую оболочку, лучше всего сделать это в подоболочке (вы пробовали, но не с nohup):

(cd path && nohup command) &

или даже

(cd path && exec nohup command) &

где exec делает nohup заменой процесса subshell, который больше не нужен; nohup будет заменен command потому что так работает инструмент. Таким образом, вы получите один процесс вместо многих.

В качестве альтернативы вы можете nohup целую оболочку. Это позволяет вам выполнять несколько команд:

nohup sh -c 'cd path || exit; command1; command2' &

(В этом случае exec имеет смысл только перед command2).

Примечание. nohup создает файл nohup.out , если вы не перенаправите его вывод (см. man 1 nohup). Место создания файла зависит от текущего рабочего каталога процесса nohup , поэтому, в общем случае, имеет значение, будете ли вы записывать компакт- cd перед nohup (cd path && nohup ...) или наоборот (nohup sh -c 'cd path ... ').

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .