답변:
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
경우 다음 명령으로 인수없이 실행하면됩니다 . 이는 백그라운드 프로세스가 더 이상 쉘 "작업"과 연관되지 않으며 쉘에서 전달 된 신호가 없음을 의미합니다. (구별 참고 : disown
ED 프로세스가 자동으로 그 부모 쉘하여 전달 아무 신호를 얻을 수 없다 - 그러나없이 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
을 사용하면 출력 스트림에서 입력 파일 디스크립터가 열린 상태로 프로세스가 작성되므로 파일 끝을 누르는 대신 읽기 시도로 인해 치명적인 "잘못된 파일 디스크립터"오류가 발생합니다.
nohup
"프로세스가 나중에 표준 입력에서 아무것도를 읽으려고하면, 당신이 전경 및 유형 뭔가 다시 가져다 대기, 일시 중지됩니다." 잘못된 것 같습니다. 대신 nohup
표준 입력을 닫습니다 (프로그램은 포 그라운드에서 실행 되더라도 입력을 읽을 수 없습니다. 정지되지는 않지만 오류 코드 또는 EOF를 수신함).
nohup
하지 않습니다 . 참고 nohup
쉘 내장하지만 바이너리 유틸리티 아니다.
nohup
리눅스와 BSD 또는 OS X 의 구현 이 다르다는 것을 의미 합니까?
awk
다르다, sed
다르다, nohup
다르다 ...
세 개의 I / O 스트림을 모두 리디렉션하려고 했습니까?
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
>
</ dev / null이 아닌 / dev / null 이 아니어야합니까 ?
< /dev/null
는의 표준 입력을 리디렉션합니다 nohup
. 리눅스는 이것을 요구하지 않지만 POSIX는 nohup
표준 입력이 터미널에 연결되어 있으면 백그라운드에서 실행할 수없는 동작을 허용 합니다. 그러한 시스템의 예는 BSD와 OS X입니다.
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.
참고 프로그램 작성자와 관련이 없습니다. 나는 프로그램의 만족스러운 사용자입니다.
mac / linux에 BASH 셸이있는 경우 아래 단계를 수행하여 리디렉션을 실제로 이해하십시오.
zz.sh라는 2 줄 스크립트를 만듭니다.
#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
현재 단순히 스크립트를 실행하면 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
설명:
결국, nohup 명령 안에 모든 것을 포장 하고 백그라운드에서 실행할 수 있습니다.
nohup zz.sh 1> zfile.txt 2>&1&