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만 실행하면 Python 스크립트를 호출하는 bash 스크립트가 실행됩니다. 나는 텍스트를 본 적이 없으며 로그에도 나타나지 않습니다. sh 스크립트의 명령은 date내 로그에는 표시되지만 터미널에는 표시되지 않습니다. 도와주실 수 있나요? shutdownlauncher.sh터미널과 로그에서도 출력을 보려면 cron 작업을 편집하는 방법은 무엇입니까 ? 이 모든 것은 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

python3의 출력이 해당 파이프로 이동 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제 예에서는) stdout 버퍼를 플러시하도록 명시적으로 요청할 수 있습니다 .

$ 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로 이동해야 하며 stderr은 tty 장치로 이동하지 않더라도 버퍼링되지 않습니다.

$ 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

관련 정보