nohup.out을 얻지 않고 nohup 명령을 어떻게 사용합니까?


309

nohup 명령에 문제가 있습니다.

작업을 실행할 때 많은 데이터가 있습니다. 출력 nohup.out이 너무 커지고 프로세스 속도가 느려집니다. nohup.out을 얻지 않고 어떻게이 명령을 실행할 수 있습니까?


답변:


612

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경우 다음 명령으로 인수없이 실행하면됩니다 . 이는 백그라운드 프로세스가 더 이상 쉘 "작업"과 연관되지 않으며 쉘에서 전달 된 신호가 없음을 의미합니다. (구별 참고 : disownED 프로세스가 자동으로 그 부모 쉘하여 전달 아무 신호를 얻을 수 없다 - 그러나없이 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을 사용하면 출력 스트림에서 입력 파일 디스크립터가 열린 상태로 프로세스가 작성되므로 파일 끝을 누르는 대신 읽기 시도로 인해 치명적인 "잘못된 파일 디스크립터"오류가 발생합니다.


1
관련하여 nohup"프로세스가 나중에 표준 입력에서 아무것도를 읽으려고하면, 당신이 전경 및 유형 뭔가 다시 가져다 대기, 일시 중지됩니다." 잘못된 것 같습니다. 대신 nohup 표준 입력을 닫습니다 (프로그램은 포 그라운드에서 실행 되더라도 입력을 읽을 수 없습니다. 정지되지는 않지만 오류 코드 또는 EOF를 수신함).
Tim

1
@Tim-그 대답은 Linux에는 정확하지만 표준 입력을 자동으로 닫지 않는 BSD 또는 OS X에는 적합 nohup하지 않습니다 . 참고 nohup쉘 내장하지만 바이너리 유틸리티 아니다.
Mark Reed

nohup은 coreutils의 일부입니다. nohup리눅스와 BSD 또는 OS X 의 구현 이 다르다는 것을 의미 합니까?
Tim

예. "coreutils"라는 이름은 GNU 패키지를 나타냅니다. 그러나 BSD, OS X, SmartOS / Illumos 및 많은 상업용 유닉스 (기본적으로 GNU보다 오래 지속 된 유닉스)에는 GNU 이외의 핵심 유틸리티가 있습니다. awk다르다, sed다르다, nohup다르다 ...
Mark Reed

왜 "추가 안전"을 작성 </dev/null했습니까? 또한 0>/dev/null unix.stackexchange.com/a/266247
Tim

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

그게 당신이해야 할 전부입니다!


4
거의 같은 내용을 가진 또 다른 대답이 있었지만 끝에 "&"가 추가되지 않았습니다.
11101101b

10
&온은 사용할 필요에서 당신을 지킬 것이다 ctrl-c당신에게 그 문제 경우.
SunSparc

1
BG에서 실행하는 기능은 매우 유용
ist_lion

이것은 some_command오류를 포함 하여 출력 캡처에 열중하지 않은 경우에만 유용합니다 .
wulfgarpro

12

세 개의 I / O 스트림을 모두 리디렉션하려고 했습니까?

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

1
></ dev / null이 아닌 / dev / null 이 아니어야합니까 ?
Scott Chu

3
@ScottChu < /dev/null는의 표준 입력을 리디렉션합니다 nohup. 리눅스는 이것을 요구하지 않지만 POSIX는 nohup표준 입력이 터미널에 연결되어 있으면 백그라운드에서 실행할 수없는 동작을 허용 합니다. 그러한 시스템의 예는 BSD와 OS X입니다.
Mikko Rantalainen

8

detach 프로그램 을 사용하고 싶을 수도 있습니다 . 당신은 그것을 좋아 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.

참고 프로그램 작성자와 관련이 없습니다. 나는 프로그램의 만족스러운 사용자입니다.


2
링크가 끊어지지 않았으며 git repo가 ​​오래되었습니다. 현재 v0.2.3은 포함되어 있지 않습니다.
Dan D.

5

다음 명령을 사용하면 nohup.out을 얻지 않고도 백그라운드에서 무언가를 실행할 수 있습니다.

nohup command |tee &

이런 방식으로 원격 서버에서 스크립트를 실행하는 동안 콘솔 출력을 얻을 수 있습니다. 여기에 이미지 설명을 입력하십시오


4
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null"  &

sudo의 출력을 재 지정하면 sudo가 암호를 생성하게되므로이 변형을 수행하는 데는 어색한 메커니즘이 필요합니다.


1

mac / linux에 BASH 셸이있는 경우 아래 단계를 수행하여 리디렉션을 실제로 이해하십시오.

zz.sh라는 2 줄 스크립트를 만듭니다.

#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
  • echo 명령의 출력은 STDOUT 파일 스트림 (파일 설명자 1)으로 들어갑니다.
  • 오류 명령의 출력은 STDERR 파일 스트림으로 이동합니다 (파일 설명자 2).

현재 단순히 스크립트를 실행하면 STDOUT과 STDERR이 모두 화면으로 전송됩니다.

./zz.sh

이제 표준 리디렉션으로 시작하십시오.

zz.sh > zfile.txt

위의 "echo"(STDOUT)는 zfile.txt에 들어갑니다. 화면에 "오류"(STDERR)가 표시됩니다.

위와 동일합니다 :

zz.sh 1> zfile.txt

이제 반대를 시도하고 "오류"STDERR을 파일로 리디렉션 할 수 있습니다. "echo"명령의 STDOUT이 화면으로 이동합니다.

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&

1

아래 명령을 실행할 수 있습니다.

nohup <your command> & >  <outputfile> 2>&1 &

예를 들어 스크립트 안에 nohup 명령이 있습니다.

./Runjob.sh > sparkConcuurent.out 2>&1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.