백그라운드에서 C 프로그램을 실행하려고 합니다. 또한 프로그램의 표준 출력을 저장하고 싶습니다.
그러나 nohup은 다음을 시도하는 경우에만 stderr 출력을 logfile.txt로 리디렉션합니다.
nohup ./GetTempValues 11 4 > logfile.txt 2>&1 &
여기서 11과 4는 내 프로그램에 전달해야 하는 매개변수이고 마지막 매개변수는 &
백그라운드에서 프로그램을 실행하는 데 사용되는 매개변수입니다(GetTempValues는 내 프로그램입니다).
답변1
GetTempValues
애초에 표준 출력이 생성된다고 확신하시나요 ? 귀하의 구문이 "나에게 적합"하기 때문입니다.
$ nohup perl test.pl >logfile.txt 2>&1 &
[1] 20964
$ cat logfile.txt
this goes to stderr
this goes to stdout
[1]+ Done nohup perl test.pl > logfile.txt 2>&1
test.pl
어디
print STDOUT "this goes to stdout\n";
print STDERR "this goes to stderr\n";
PS: 귀하의 예에서는 2>&1
STDERR을 STDOUT으로 리디렉션할 필요가 없습니다.nohup
"표준 오류가 터미널인 경우 표준 출력과 동일한 위치로 전달됩니다."( nohup
매뉴얼 페이지).
답변2
Guido가 위에서 지적했듯이,북면표준 오류는 파일로 리디렉션하지 않는 한 이미 리디렉션되었습니다. Linux를 사용하는 경우 nohup에서 간단한 명령을 실행하고 dup2(2)
이전 호출을 확인하는 것이 도움이 될 수 있습니다 execve(2)
.
나는 당신이 보는 것이 당신이 본다고 생각하는 것이라고 의심합니다. 당신이 말하면 무슨 일이 일어나는지 생각해 봅시다.
nohup foo 2>&1
- 쉘은 stderr를 stdout으로 리디렉션합니다.
- 그런 다음 호출됩니다.북면, 이는 이러한 상황을 상속합니다(stderr 및 stdout은 동일한 파일 설명자를 사용함).
- 북면(파일 설명자 3)을 열고
nohup.out
파일 설명자 1에 복사한 다음 3을 닫습니다. - 북면stderr은 파일이 아니며 파일 설명자 1~2도 복사됩니다. 따라서 파일 설명자 1과 2가 모두 참조됩니다
nohup.out
. - 북면
exec
명령줄에 제공된 인수를 사용하여 호출됩니다(이 경우부자). 새 프로세스는 파일 설명자를 상속받습니다.북면그것을 위해 설정합니다.
말씀하신 것처럼 명령줄에서는 케이스를 생성할 수 없습니다.nohup은 stderr 출력만 리디렉션합니다.. 북면항상 stdout 및 stderr을 파일에 작성하십시오. stdout은 리디렉션을 통해 지정한 파일로 이동합니다 nohup.out
. stderr은 명시적으로 다른 파일로 리디렉션하지 않는 한 stdout을 따릅니다.
2>&1
함께 사용하는 특별한 측면북면GNU 버전은 stderr에 의미 없는 메시지를 생성합니다.nohup: 입력을 무시하고 "nohup.out"에 출력을 추가합니다.. (다른 유틸리티는 다음과 같은 메시지를 표준 오류에 기록합니다.문서 지침을 따르십시오.?) 일반적으로 노이즈는 리디렉션 시 터미널에 기록되며 출력 파일의 첫 번째 줄로 끝납니다.