Ответы:
Команда выполняет nohup
запись только в том nohup.out
случае, если выходные данные поступили бы в терминал. Если вы перенаправили вывод команды куда-то еще - в том числе /dev/null
- вот куда она идет.
nohup command >/dev/null 2>&1 # doesn't create nohup.out
Если вы используете nohup
, это, вероятно, означает, что вы хотите запустить команду в фоновом режиме, поставив другую &
в конец всего этого:
nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out
В Linux запуск задания с nohup
автоматически закрывает и его ввод. В других системах, особенно в BSD и macOS, это не так, поэтому при работе в фоновом режиме может потребоваться закрыть ввод вручную. Хотя закрытие ввода не влияет на создание или нет nohup.out
, это позволяет избежать другой проблемы: если фоновый процесс пытается что-то прочитать из стандартного ввода, он приостановится, ожидая, что вы вернете его на передний план и что-то наберете. Так что особо безопасная версия выглядит так:
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
Однако обратите внимание, что это не мешает команде получить прямой доступ к терминалу и не удаляет ее из группы процессов вашей оболочки. Если вы хотите сделать последнее, и вы запускаете bash, ksh или zsh, вы можете сделать это, запустив disown
без аргумента следующую команду. Это будет означать, что фоновый процесс больше не связан с «заданием» оболочки и не будет передавать ему какие-либо сигналы из оболочки. (Обратите внимание на различие: disown
процесс ed не получает сигналов, перенаправляемых ему автоматически своей родительской оболочкой - но без nohup
него он все равно будет получать HUP
сигнал, отправленный с помощью других средств, таких как ручная kill
команда. nohup
Процесс ed игнорирует все HUP
сигналы, независимо от того, как они отправлены.)
Объяснение:
В системах Unixy каждый источник ввода или цели вывода имеет связанный с ним номер, называемый «дескриптором файла», или, для краткости, «fd». Каждая запущенная программа («процесс») имеет свой собственный набор из них, и когда запускается новый процесс, у него уже три из них открыты: «стандартный ввод», который является fd 0, открыт для процесса для чтения, в то время как «стандартный вывод» (fd 1) и «стандартная ошибка» (fd 2) открыты для записи. Если вы просто запускаете команду в окне терминала, то по умолчанию все, что вы вводите, отправляется на его стандартный ввод, в то время как стандартный вывод и стандартная ошибка отправляются в это окно.
Но вы можете попросить оболочку изменить место, на которое указывает какой-либо или все эти файловые дескрипторы, перед запуском команды; это то, что переназначение ( <
, <<
, >
, >>
) и трубы ( |
делать) операторы.
Труба является самым простым из этих ... command1 | command2
организует стандартный вывод command1
для подачи непосредственно на стандартный ввод command2
. Это очень удобная схема, которая привела к определенному шаблону проектирования в инструментах UNIX (и объясняет существование стандартной ошибки, которая позволяет программе отправлять сообщения пользователю, даже если ее выходные данные передаются следующей программе в конвейере) , Но вы можете только передать стандартный вывод на стандартный ввод; Вы не можете отправлять любые другие файловые дескрипторы в канал без каких-либо манипуляций.
Операторы перенаправления более удобны тем, что позволяют указать, какой дескриптор файла следует перенаправить. Таким образом, 0<infile
читает стандартный ввод из имени файла infile
, в то время как 2>>logfile
добавляет стандартную ошибку в конец имени файла logfile
. Если вы не укажете число, то по умолчанию перенаправление ввода <
будет равно fd 0 ( то же самое, что и 0<
), а перенаправление вывода по умолчанию >
равно fd 1 ( то же самое, что и 1>
).
Кроме того, вы можете объединить файловые дескрипторы вместе: 2>&1
означает «отправлять стандартную ошибку, куда идет стандартный вывод». Это означает, что вы получаете один поток вывода, который включает как стандартную ошибку вывода, так и стандартную ошибку, смешанную без возможности их разделения, но это также означает, что вы можете включить стандартную ошибку в канал.
Таким образом, последовательность >/dev/null 2>&1
означает «отправлять стандартный вывод на /dev/null
» (это специальное устройство, которое просто выбрасывает все, что вы пишете на него), а затем отправлять стандартную ошибку туда, куда идет стандартный вывод »(что мы только что убедились /dev/null
). По сути, «выбросить все, что эта команда записывает в любой дескриптор файла».
Когда nohup
обнаруживается, что ни его стандартная ошибка, ни выходные данные не присоединены к терминалу, он не пытается их создать nohup.out
, но предполагает, что выходные данные уже перенаправлены туда, куда пользователь хочет, чтобы они пошли.
/dev/null
Устройство работает для ввода, тоже; если вы запускаете команду с помощью </dev/null
, то любая попытка этой команды прочитать данные из стандартного ввода мгновенно встретит конец файла. Обратите внимание, что синтаксис слияния не будет иметь такой же эффект здесь; он работает только для указания дескриптора файла на другой, открытый в том же направлении (вход или выход). Оболочка позволит вам это сделать >/dev/null <&1
, но это приведет к созданию процесса с открытым дескриптором входного файла в выходном потоке, поэтому вместо простого нажатия на конец файла любая попытка чтения вызовет фатальную ошибку «неверный дескриптор файла».
nohup
, «если процесс позже попытается что-то прочитать из стандартного ввода, он остановится, ожидая, что вы вернете его на передний план и наберете что-нибудь». кажется неверным. Вместо этого nohup
закрывается стандартный ввод (программа не сможет прочитать какой-либо ввод, даже если он запущен на переднем плане. Он не остановлен, но получит код ошибки или EOF).
nohup
делает не близко стандартный ввод автоматически. Обратите внимание, что nohup
это не встроенная оболочка, а бинарная утилита.
nohup
для Linux и BSD или OS X различна?
awk
отличается, sed
отличается, nohup
отличается ...
</dev/null
? Также см. 0>/dev/null
Unix.stackexchange.com/a/266247
nohup some_command > /dev/null 2>&1&
Это все, что вам нужно сделать!
&
не позволит вам использовать его ctrl-c
, если это важно для вас.
some_command
вывода, в том числе об ошибке.
Вы пытались перенаправить все три потока ввода / вывода:
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
>
/ dev / null, а не </ dev / null?
< /dev/null
перенаправляет стандартный ввод для nohup
. Linux не требует этого, но POSIX допускает поведение, когда nohup
не может работать в фоновом режиме, если его стандартный вход подключен к терминалу. Примерами таких систем являются BSD и OS X.
Вы можете использовать программу отсоединения . Вы используете это как, nohup
но это не производит выходной журнал, если вы не говорите это. Вот справочная страница:
NAME
detach - run a command after detaching from the terminal
SYNOPSIS
detach [options] [--] command [args]
Forks a new process, detaches is from the terminal, and executes com‐
mand with the specified arguments.
OPTIONS
detach recognizes a couple of options, which are discussed below. The
special option -- is used to signal that the rest of the arguments are
the command and args to be passed to it.
-e file
Connect file to the standard error of the command.
-f Run in the foreground (do not fork).
-i file
Connect file to the standard input of the command.
-o file
Connect file to the standard output of the command.
-p file
Write the pid of the detached process to file.
EXAMPLE
detach xterm
Start an xterm that will not be closed when the current shell exits.
AUTHOR
detach was written by Robbert Haarman. See http://inglorion.net/ for
contact information.
Обратите внимание, я не имею никакого отношения к автору программы. Я всего лишь довольный пользователь программы.
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null" &
Перенаправление вывода sudo заставляет sudo повторно запросить пароль, поэтому для этого варианта необходим неуклюжий механизм.
Если у вас есть оболочка BASH на вашем Mac / Linux перед вами, попробуйте следующие шаги, чтобы понять перенаправление практически:
Создайте двухстрочный скрипт с именем zz.sh
#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
В настоящее время простое выполнение сценария отправляет STDOUT и STDERR на экран.
./zz.sh
Теперь начнем со стандартного перенаправления:
zz.sh > zfile.txt
Выше эхо (STDOUT) входит в zfile.txt. Принимая во внимание, что «ошибка» (STDERR) отображается на экране.
Вышеуказанное совпадает с:
zz.sh 1> zfile.txt
Теперь вы можете попробовать обратное, и перенаправить STDERR «ошибка» в файл. STDOUT из команды "echo" отправляется на экран.
zz.sh 2> zfile.txt
Комбинируя два вышеупомянутых, вы получаете:
zz.sh 1> zfile.txt 2>&1
Объяснение:
В конце концов, вы можете упаковать все это в команду nohup и запустить ее в фоновом режиме:
nohup zz.sh 1> zfile.txt 2>&1&