쉘 스크립트를 사용하여 Python 출력을 리디렉션하여 Python 스크립트 실행

쉘 스크립트를 사용하여 Python 출력을 리디렉션하여 Python 스크립트 실행

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'

관련 정보