run.sh
충돌이 발생하면 다시 시작하기 위해 쉘 스크립트를 사용하여 Python 스크립트를 실행하고 있습니다 .
#!/bin/sh
COMMAND='nohup python3 -u test.py run >> py.log &'
LOGFILE=restart.txt
writelog() {
now=`date`
echo "$now $*" >> $LOGFILE
}
writelog "Starting"
while true ; do
$COMMAND
writelog "Exited with status $?"
writelog "Restarting"
done
나는 뛰고있어
nohup sh -u run.sh > output&
문제는 Python이 첫 번째 출력(print())만 py.log로 스트리밍한다는 것입니다.. 스트림을 즉시 출력하려면 어떻게 해야 합니까? 나도 그것을 시도했습니다 COMMAND=./test.py run >> py.log &
. 어떤 도움이라도 감사하겠습니다. 감사해요.
답변1
쉘 스크립트가 스크립트 'run >> py.log &'
에 문자열을 전달하고 있으며 test.py
이로 인해 올바르게 실행되지 않을 수 있습니다.
스크립트를 약간 변경해야 합니다.
#!/bin/sh
COMMAND='nohup python3 -u test.py run'
LOGFILE=restart.txt
writelog() {
now=`date`
echo "$now $*" >> $LOGFILE
}
writelog "Starting"
while true ; do
$COMMAND >> py.log &
writelog "Exited with status $?"
writelog "Restarting"
done
이제 $COMMAND
백그라운드에서 실행하고 출력을 py.log
.
원본 스크립트가 작동하지 않는 이유는 출력 리디렉션을 설정한 후 셸 변수가 확장되어 >>
더 이상 &
셸 명령의 일부로 인식되지 않고 Python 스크립트에 매개변수 문자열로 전달되기 때문입니다. LESS='+/SIMPLE COMMAND EXPANSION' man bash
명령 처리 단계를 참조할 수 있습니다 .
답변2
결국 모듈을 사용하여 redirect_stdout
출력을 파일로 리디렉션한 다음 sys.stdout.flush()
각 . 이제 실시간으로 출력을 스트리밍하고 있습니다.print()
COMMAND='./test.py run'