다음 명령을 사용하여 백그라운드에서 파이썬 스크립트를 실행하고 있습니다.
nohup ./cmd.py > cmd.log &
그러나 nohup이 로그 파일에 아무것도 쓰지 않는 것 같습니다. cmd.log가 작성되지만 항상 비어 있습니다. 파이썬 스크립트에서는 표준 출력으로 인쇄 하는 sys.stdout.write
대신 사용 print
하고 있습니다. 내가 잘못하고 있습니까?
다음 명령을 사용하여 백그라운드에서 파이썬 스크립트를 실행하고 있습니다.
nohup ./cmd.py > cmd.log &
그러나 nohup이 로그 파일에 아무것도 쓰지 않는 것 같습니다. cmd.log가 작성되지만 항상 비어 있습니다. 파이썬 스크립트에서는 표준 출력으로 인쇄 하는 sys.stdout.write
대신 사용 print
하고 있습니다. 내가 잘못하고 있습니까?
답변:
stdout을 주기적으로 플러시해야하는 것 같습니다 (예 :) sys.stdout.flush()
. 필자의 테스트에서 파이썬은 print
프로그램이 종료 될 때 까지이 작업을 자동으로 수행하지 않습니다 .
python -u
작동하지 않는; nohup
자체 버퍼링을 도입했을 수 있습니다.
nohup
출력을 버퍼링하지 않고 python -u
정상적으로 작동합니다. (사람을위한 업데이트)
nohup
POSIX 유틸리티로 플랫폼마다 다른 구현이있을 수 있습니다. btw, python3 I / O는 더 이상 C stdio 기반이 아니지만 유사한 버퍼링 동작을 갖습니다.
-u
출력 버퍼링을 피하기 위해 플래그 와 함께 Python을 실행할 수 있습니다 .
nohup python -u ./cmd.py > cmd.log &
-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과 같은 도구를 사용하여 백그라운드에서 작업을 실행하고 예약 된 실행을 제안합니다.
export PYTHONUNBUFFERED=1
nohup ./cmd.py > cmd.log &
또는
nohup python -u ./cmd.py > cmd.log &
nohup
을 사용하고 있습니까? BSD 버전은nohup.out
현재 디렉토리에서 호출 된 파일에 기록합니다 (또는$HOME/nohup.out
현재 디렉토리에 쓰기 가능하지 않은 경우). 출력 파일 이름을 변경하는 방법이 보이지 않습니다.