Nohup이 로그를 출력 파일에 쓰지 않습니다.


141

다음 명령을 사용하여 백그라운드에서 파이썬 스크립트를 실행하고 있습니다.

nohup ./cmd.py > cmd.log &

그러나 nohup이 로그 파일에 아무것도 쓰지 않는 것 같습니다. cmd.log가 작성되지만 항상 비어 있습니다. 파이썬 스크립트에서는 표준 출력으로 인쇄 하는 sys.stdout.write대신 사용 print하고 있습니다. 내가 잘못하고 있습니까?


어떤 변형 nohup을 사용하고 있습니까? BSD 버전은 nohup.out현재 디렉토리에서 호출 된 파일에 기록합니다 (또는 $HOME/nohup.out현재 디렉토리에 쓰기 가능하지 않은 경우). 출력 파일 이름을 변경하는 방법이 보이지 않습니다.
wulong

@wulong stdout이 터미널 인 경우에만 해당됩니다.
John Kugelman

또한 리디렉션하지 않고 명령을 시도했지만 nohup.out 파일을 전혀 만들지 않았습니다. 어떤 변형인지 모르지만 도움이된다면 SunOS 5.10에 있습니다.

답변:


103

stdout을 주기적으로 플러시해야하는 것 같습니다 (예 :) sys.stdout.flush(). 필자의 테스트에서 파이썬은 print프로그램이 종료 될 때 까지이 작업을 자동으로 수행하지 않습니다 .


17
파이썬뿐만 아니라 다른 C stdio 기반 프로그램은 대화 형 경우 라인 버퍼링 (stdout은 tty에 연결됨)을 사용하고 파일로 리디렉션 될 때 블록 버퍼링을 사용합니다. 만약 python -u작동하지 않는; nohup자체 버퍼링을 도입했을 수 있습니다.
jfs

12
@JFSebastian 현재, nohup출력을 버퍼링하지 않고 python -u정상적으로 작동합니다. (사람을위한 업데이트)
Pijusn

1
@Pius : nohupPOSIX 유틸리티로 플랫폼마다 다른 구현이있을 수 있습니다. btw, python3 I / O는 더 이상 C stdio 기반이 아니지만 유사한 버퍼링 동작을 갖습니다.
jfs

382

-u출력 버퍼링을 피하기 위해 플래그 와 함께 Python을 실행할 수 있습니다 .

nohup python -u ./cmd.py > cmd.log &

12
이게 낫다! 고마워 :)
Sadjad

@kommradHomer 나는 그것이 프로그램이 생성하는 stdout / stderr의 출력량에 달려 있다고 생각합니다.
vz0

1
매력처럼 작동합니다. 또한 올바른 것으로 선택한 것보다 더 나은 답변이라고 생각합니다. 다른 사람을 혼동하지 않기 위해 이것을 올바른 것으로 표시해 주시겠습니까?
Ondrej Burkert

1
경고 : 항상 작동하지는 않습니다 . 이유를 모르겠습니다. 당신 은요?
Basj

3
이것은 받아 들여진 대답이어야합니다 ... 내가 원하는 것을했습니다. 감사!
크링커

42
  • -u 와 함께 사용하면 nohup나를 위해 일했습니다. 를 사용 -u하면 stdout, stderr스트림이 버퍼되지 않습니다. stdin에는 영향을 미치지 않습니다. 모든 것이 " nohup.out "파일에 저장 됩니다. 이처럼

    nohup python -u your_code.py &

    디렉토리에 저장할 수도 있습니다. 이 방법-

    nohup python -u your_code.py > your_directory/nohup.out &
  • 또한을 사용할 수 있습니다 PYTHONUNBUFFERED. 비어 있지 않은 문자열로 설정하면 -u옵션 과 동일하게 작동합니다 . 파이썬 코드를 실행하기 전에 아래 명령을 사용하십시오.

    export PYTHONUNBUFFERED=1

    또는

    export PYTHONUNBUFFERED=TRUE

추신- 나는 cron-job과 같은 도구를 사용하여 백그라운드에서 작업을 실행하고 예약 된 실행을 제안합니다.


@ vz0의 답변과 차이점은 무엇입니까?
Deqing

1
@Deqing에는 차이가 없습니다.
오버 코딩


2

Python 3.3 이상에는 인쇄에 대한 플러시 인수가 있으며 이것이 나를 위해 유일한 방법입니다.

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)

0

비슷한 문제가 있었지만 Python 프로세스와 관련이 없습니다. 나는 nohup을 한 스크립트를 실행하고 있었고 스크립트는 cron을 통해 주기적으로 실행되었습니다.

다음을 통해 문제를 해결할 수있었습니다.

  1. stdin, stdout 및 stderr 리디렉션
  2. nohup을 통해 호출되는 스크립트가 백그라운드에서 다른 것을 실행하지 않았는지 확인

추신 : 내 스크립트는 RHEL에서 실행되는 ksh로 작성되었습니다.

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