Как использовать команду nohup, не получая nohup.наружу?

У меня проблема с командой nohup.

когда я запускаю свою работу, у меня много данных. В nohup и выход.снаружи становится слишком большим, и мой процесс замедляется. Как я могу запустить эту команду, не получая nohup.наружу?

8 ответов


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, каждый источник входного сигнала или цель выхода имеют a номер, связанный с ним, называется "файловым дескриптором" или "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 some_command > /dev/null 2>&1&

это все, что вам нужно!


вы пытались перенаправить все три потока ввода-вывода:

nohup ./yourprogram > foo.out 2> foo.err < /dev/null &

возможно, вы захотите использовать программы отсоединения. Вы используете его как nohup но он не создает журнал вывода, Если вы не скажете ему. Вот страница man:

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 переназначать пароль, поэтому для этого варианта необходим неудобный механизм.


следующая команда позволит вам запустить что-то в фоновом режиме, не получая nohup.out:

nohup command |tee &

таким образом, Вы сможете сделать вывод консоли при запуске скрипта на удаленном сервере: enter image description here


вы можете сделать ниже nohup & > 2>&1 & например. У меня нет команды hup внутри скрипта ./Runjob.sh > sparkConcuurent.out 2>&1


если у вас есть оболочка BASH на вашем mac / linux перед вами, вы попробуете следующие шаги, чтобы понять перенаправление практически:

создать 2 скрипта линию zz.sh

#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
  • вывод команды echo переходит в stdout filestream (файловый дескриптор 1).
  • вывод команды ошибки переходит в stderr filestream (файловый дескриптор 2)

в настоящее время просто выполнение сценария отправляет как STDOUT, так и STDERR кино.

./zz.sh

теперь начните со стандартного перенаправления:

zz.sh > zfile.txt

в приведенном выше "echo" (STDOUT) переходит в zfile.формат txt. В то время как" ошибка " (STDERR) отображается на экране.

выше то же самое, что:

zz.sh 1> zfile.txt

теперь вы можете попробовать противоположное и перенаправить" error " STDERR в файл. Команда STDOUT от "echo" переходит на экран.

zz.sh 2> zfile.txt

объединение двух вышеупомянутых, вы получить:

zz.sh 1> zfile.txt 2>&1

объяснение:

  • сначала отправьте STDOUT 1 в zfile.txt
  • затем отправьте STDERR 2 в STDOUT 1 (используя указатель &1).
  • поэтому как 1, так и 2 входят в один и тот же файл (zfile.txt)

в конце концов, вы можете упаковать все, что внутри команда nohup&, чтобы запустить его в фоновом режиме:

nohup zz.sh 1> zfile.txt 2>&1&