Python의 출력 인쇄 문은 cron 로그에 입력되지 않습니다.

Python의 출력 인쇄 문은 cron 로그에 입력되지 않습니다.

내 crontab은 다음과 같습니다.

@reboot sh /home/pi/LCDinterface/shutdownlauncher.sh 2>&1 | tee -a /home/cronlog

콘텐츠 shutdownlauncher.sh:

cd /
cd home/pi/LCDinterface


date
python shutdown.py 
echo ''
cd /

콘텐츠 shutdown.py:

if interrupt_happens:
  print ("shutting down")
  time.sleep(3)
  os.system("sudo shutdown -h now")

실행하거나 실행하면 python shutdown.py터미널 sh shutdownlauncher.sh에서 항상 "닫기"라는 출력 텍스트를 볼 수 있습니다. 그러나 cron만 bash 스크립트 실행을 시작하면 Python 스크립트가 호출됩니다. 나는 그 텍스트를 본 적이 없으며 로그에도 나타나지 않습니다. sh 스크립트의 명령은 date내 로그에는 표시되지만 터미널에는 표시되지 않습니다. 도와주세요? shutdownlauncher.sh터미널과 로그에서 출력을 보기 위해 작업을 편집하거나 크론하려면 어떻게 해야 합니까 ? 전체 프로세스는 Raspberry Pi 3에서 실행되며 SSH를 통해 연결합니다.

내 로그 파일 내용:

Fri Apr  7 19:26:33 CEST 2017
Fri Apr  7 19:36:11 CEST 2017
Fri Apr  7 21:18:45 CEST 2017
Sat Apr  8 00:08:09 CEST 2017
Sat Apr  8 00:29:31 CEST 2017
Sat Apr  8 10:08:17 CEST 2017
Sat Apr  8 11:58:35 CEST 2017

답변1

인쇄 기능 대신 모듈을 사용해보십시오 syslog.

import syslog
syslog.syslog('System is going to shutdown')

답변2

비교하다:

python3 -c 'import time; print("foo"); time.sleep(1); print("bar")'

그리고:

python3 -c 'import time; print("foo"); time.sleep(1); print("bar")' | cat

python3when의 출력이 해당 파이프로 들어가고 foo마지막 bar에만 인쇄된다는 것을 알 수 있습니다 .

또는:

$ python3 -c 'import os, signal; print("foo"); os.kill(os.getpid(), signal.SIGTERM); print("bar")'
foo
zsh: terminated  python3 -c
$ python3 -c 'import os, signal; print("foo"); os.kill(os.getpid(), signal.SIGTERM); print("bar")' | cat
zsh: terminated  python3 -c  |
zsh: done        cat

대부분의 언어와 마찬가지로 표준 출력이 사용자가 사용하기 위해 터미널 장치로 전송되지 않으면 너무 많은 불필요한 쓰기를 수행할 필요가 없도록 버퍼링됩니다.

shutdown이 스크립트를 포함한 모든 프로세스는 결국 종료되므로 버퍼 python는 플러시되지 않습니다.

다음을 호출하기 전에 표준 출력 버퍼를 플러시 shutdown하도록 명시적으로 요청할 수 있습니다 kill.

$ python3 -c 'import os, signal, sys; print("foo"); sys.stdout.flush(); os.kill(os.getpid(), signal.SIGTERM); print("bar")' | cat
foo
zsh: terminated  python3 -c  |
zsh: done        cat

하지만 여기서 메시지는 stdout 대신 stderr로 전송되어야 하며, tty 장치로 전송되지 않더라도 stderr은 버퍼링되지 않으므로 다음과 같습니다.

$ python3 -c 'import os, signal, sys; print("foo", file=sys.stderr); os.kill(os.getpid(), signal.SIGTERM); print("bar")' 2>&1 | cat
foo
zsh: terminated  python3 -c  2>&1 |
zsh: done        cat

관련 정보