Как выполнить команду Linux в фоновом режиме?

18169
ShitalSavekar

В настоящее время я использую, 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», чтобы перейти к следующей команде.

Есть ли решение? Любая помощь будет принята с благодарностью.

2
Почему вы экспериментируете с командами как `root`? Используйте непривилегированную учетную запись. chepner 10 лет назад 0
Напишите ваши команды nohup в одном скрипте, скажем «script.sh» ... и выполните его (sh script.sh) ... Надеюсь, это должно работать ... и да, попробуйте привилегированную учетную запись ... Debaditya 10 лет назад 1
Вам не нужно нажимать ENTER, nohup просто не может добавить CR в конце выходного файла. Ваша оболочка все еще анализирует ваш ввод. mathk 10 лет назад 0

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

5
Uwe
nohup sleep 10 2>/dev/null & 

Команда nohupпечатает сообщение в stderr и 2>/dev/nullотправляет stderr в /dev/null.

Спасибо Уве .. Вы спасли день ..! Ваши ответы были именно тем, что я искал. 10 лет назад 0
3
Jens

Нет необходимости для входа. Просто введите следующую команду, и она будет работать (то, что вы видите, это просто какой-то вывод после того, как ваше приглашение оболочки было выведено). Это точно так же, как то, что происходит при вводе ввода в приглашении оболочки: вы получаете другое приглашение. :-)

2
chepner

Вам не нужно нажимать Enter. Хотя похоже, что стандартная ошибка nohup есть в вашей командной строке, вы можете «набрать» ее, и в качестве следующей команды будет введено только то, что вы вводите.

0
Kangarooo

С 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, но это приведет к созданию процесса с открытым дескриптором входного файла в выходном потоке, поэтому вместо простого нажатия на конец файла любая попытка чтения вызовет фатальную ошибку «неверный дескриптор файла».

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