Порядок между `nohup`, `&` и перенаправлением?

На всякий случай, если кому-то интересно, вот что я сделал, чтобы решить эту проблему.

Исправление:

sudo setfacl -R -b

Это рекурсивно (-R) удаляет все (-b) разрешения acl

Я также получал предупреждение о групповой записи для следующих файлов:

/var/lib/sudo/lectured
/var/lib/sudo/ts

Исправление:

sudo chmod 700

для обоих файлы и исправляют разрешения, а также исправляют предупреждения

3
29.02.2016, 22:27
2 ответа

Команда nohup - это команда, которую вы фактически выполняете в этом случае. Слово firefox не интерпретируется оболочкой как команда; он просто передается в качестве аргумента nohup . То, что команда nohup делает с этим аргументом, «не является делом оболочки».

Конечно, nohup принимает этот аргумент и запускает его как команду.

Дело в том, что то, что вы на самом деле делаете с точки зрения оболочки, перенаправляет вывод nohup , не вывод firefox .

Однако nohup будет делать разные вещи с выводом выполняемой команды, в зависимости от того, куда указывает его собственный вывод. Из спецификаций POSIX для nohup (выделено мной):

Если стандартный вывод - это терминал , весь вывод записывается названной утилитой по стандарту вывод должен быть добавлен в конец файла nohup.out в текущем каталоге. Если nohup.out не может быть создан или открыт для добавления, вывод должен быть добавлен в конец файла nohup.в каталоге, указанном переменной среды HOME. ...

Если стандартная ошибка - это терминал и стандартный вывод открыт, но не является терминалом , весь вывод, записанный указанной утилитой в ее стандартную ошибку, должен быть перенаправлен в то же описание открытого файла, что и стандартный вывод. ...

Итак, из-за некоторой внутренней магии nohup , ваши перенаправления работают должным образом, если вы запустите:

nohup utility >/dev/null &

Обратите внимание, что вам не нужно перенаправлять оба stderr и stdout , поскольку команда nohup перенаправит stderr из утилиты в зависимости от того, где находится nohup собственный вывод указывает на. (Не говоря уже о том, что &> не переносится.)

Также существует проблема переносимости вашего ввода. Поскольку ваш stdin подключен к вашему терминалу, то, что с ним произойдет, зависит от реализации. (См. Примечание в разделе «Обоснование» в спецификациях nohup POSIX .) Вместо этого вам может быть лучше использовать:

nohup firefox >/dev/null </dev/null &

И, как уже упоминалось в комментариях, с nohup или любую другую команду, в которой вы должны когда-либо помещать перенаправление после фонового & .

1
27.01.2020, 21:22

Я бы начал с раздела SHELL GRAMMAR на странице руководства для bash :

Простые команды

Простая команда представляет собой последовательность необязательных присваивания переменных, за которыми следуют слова, разделенные пробелами, и перенаправления , и завершаются оператором управления .

Таким образом, перенаправление ( &> / dev / null ) выполняется первым, а за ним следует оператор управления ( & ).

Править: И чтобы сделать ответ полным, nohup является первой частью простой команды . Это не имеет особого значения в bash .

Точно ваш пример (кроме / dev / null , который только усложняет его):

jakuje@E6430:/tmp$ rm nohup.out out
jakuje@E6430:/tmp$ nohup sleep 1 & &>out
[1] 10876
nohup: ignoring input and appending output to ‘nohup.out’
[1]+  Done                    nohup sleep 1
jakuje@E6430:/tmp$ cat nohup.out             # empty
jakuje@E6430:/tmp$ cat out                   # empty
jakuje@E6430:/tmp$ rm nohup.out
jakuje@E6430:/tmp$ nohup sleep 1 &>out &
[1] 10882
[1]+  Done                    nohup sleep 1 &> out
jakuje@E6430:/tmp$ cat nohup.out             # no file
cat: nohup.out: No such file or directory
jakuje@E6430:/tmp$ cat out                   # output of nohup
nohup: ignoring input
4
27.01.2020, 21:22

Теги

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