Как использовать команду nohup без получения nohup.вышел?



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



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

839   8  

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 tools (и объясняет существование стандартной ошибки, которая позволяет программе отправлять сообщения пользователю, даже если его вывод идет в следующую программу в конвейере). Но вы можете передавать только стандартный вывод на стандартный вход; вы не можете отправлять любые другие файловые дескрипторы в канал без некоторого жонглирования.

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

The /dev/null устройство работает для ввода, тоже; если вы запустите команду с </dev/null, тогда любая попытка этой команды прочитать из стандартного ввода мгновенно столкнется с концом файла. Обратите внимание, что синтаксис слияния не будет имейте тот же эффект здесь; он работает только для указания файлового дескриптора на другой, открытый в том же направлении (вход или выход). Оболочка позволит вам сделать >/dev/null <&1, но это приводит к созданию процесса с дескриптором входного файла, открытым в выходном потоке, поэтому вместо того, чтобы просто нажимать конец файла, любая попытка чтения вызовет фатальную ошибку "недопустимый дескриптор файла".

nohup some_command > /dev/null 2>&1&

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

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

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

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

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

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).
  • вывод команды error переходит в stderr filestream (файловый дескриптор 2)

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

./zz.sh

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

zz.sh > zfile.txt

в приведенном выше, " Эхо " (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&

Comments

    Ничего не найдено.