nohup sleep 10 2>/dev/null &
Команда nohup
печатает сообщение в stderr и 2>/dev/null
отправляет stderr в /dev/null
.
В настоящее время я использую, nohup command &
чтобы отправить его в фоновом режиме. Но проблема заключается в следующем: если я выполню, nohup command &
я выхожу как:
root@ubuntu:/home/test# nohup sleep 10 & [2] 52439 root@ubuntu:/home/test# nohup: ignoring input and appending output to `nohup.out' <I need to press ENTER key here to take back my shell control.> root@ubuntu:/home/test#
Что я должен сделать :
root@ubuntu:/home/test# nohup sleep 10 & [2] 52439 root@ubuntu:/home/test# nohup: ignoring input and appending output to `nohup.out' root@ubuntu:/home/test#
Я не хочу нажимать «ENTER KEY» после nohup sleep 10 &
.
Поскольку я работаю над автоматизацией, мне нужно, чтобы после отправки одной команды в фоновый режим я мог выполнять следующую команду без нажатия какой-либо клавиши. Подобно:
root@ubuntu:/home/test# nohup start-server.py & root@ubuntu:/home/test# nohup start-client.py &
[ start-server.py
должен выполняться в фоновом режиме.] но проблема в том, что после запуска start-server.py он не выполнит следующую команду. Мне нужно нажать «ENTER KEY», чтобы перейти к следующей команде.
Есть ли решение? Любая помощь будет принята с благодарностью.
nohup sleep 10 2>/dev/null &
Команда nohup
печатает сообщение в stderr и 2>/dev/null
отправляет stderr в /dev/null
.
Нет необходимости для входа. Просто введите следующую команду, и она будет работать (то, что вы видите, это просто какой-то вывод после того, как ваше приглашение оболочки было выведено). Это точно так же, как то, что происходит при вводе ввода в приглашении оболочки: вы получаете другое приглашение. :-)
Вам не нужно нажимать Enter. Хотя похоже, что стандартная ошибка nohup есть в вашей командной строке, вы можете «набрать» ее, и в качестве следующей команды будет введено только то, что вы вводите.
С https://stackoverflow.com/a/10408906/738947
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 и OS X, это не так, поэтому при работе в фоновом режиме вам может потребоваться закрыть ввод вручную. Хотя закрытие ввода не влияет на создание или не создание nohup.out
, это позволяет избежать другой проблемы: если фоновый процесс пытается что-то прочитать из стандартного ввода, он приостановится, ожидая, что вы вернете его на передний план и что-то наберете. Так что особо безопасная версия выглядит так:
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
Однако обратите внимание, что это не мешает команде получить прямой доступ к терминалу и не удаляет ее из группы процессов вашей оболочки. Если вы хотите выполнить последнее, вы можете сделать это, запустив disown
без аргумента следующую команду, после чего процесс больше не будет связан с «заданием» оболочки и не будет переадресовывать ему какие- либо сигналы (не только 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
, но это приведет к созданию процесса с открытым дескриптором входного файла в выходном потоке, поэтому вместо простого нажатия на конец файла любая попытка чтения вызовет фатальную ошибку «неверный дескриптор файла».