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'
. 이제 실시간으로 출력을 스트리밍하고 있습니다.