루프에서 Python 파일을 호출하는 쉘 스크립트가 있습니다. 예를 들면 다음과 같습니다.
for i in $(seq $start_index $end_index)
do
python my_script.py
done
특정 범위 내에서 난수를 생성할 수 없으면 Python 프로세스가 중지됩니다.
30초 이내에 콘솔에 인쇄되지 않으면 스크립트를 다시 시작하려고 시도했지만 그렇지 않으면 계속 실행됩니다.
이는 정기적으로 다시 시작해야 하는 크론 작업이 아닙니다.
그러나 추적할 수 있는 감시 작업이 이상적이지만 마지막 출력이 인쇄된 시점을 추적하는 작업은 찾지 못했습니다.
직접 출력하여 script.sh > log.txt
파일이 마지막으로 수정된 시기를 확인할 수도 있지만 이를 수행하는 우아한 방법을 찾지 못했습니다.
어떤 도움이나 지침이라도 주시면 감사하겠습니다.
답변1
OP에서 설명했듯이 :
- 프로세스를 시작했지만
my_script.py
언제 종료되거나 종료될지 예측할 수 없습니다. - 프로세스가
my_script.py
실행되어 로그 파일에 기록됩니다(file.log
중지될 때까지 호출됩니다. - 작은 간격마다 로그 파일이 30초 이전에 마지막으로 수정되었는지 확인해야 합니다. 그렇다면 프로세스를 종료하고 다시 시작하십시오.
my_script.py
이를 수행하는 방법에는 여러 가지가 있습니다. 그 중 하나는 완벽한 답변에 따라 inotify
패키지를 사용하여 파일 시스템 이벤트를 모니터링하는 것입니다 .inotify-tools
여기그리고 (더 나은)거기.
위 방법의 대안은 로그 파일의 마지막 수정 날짜를 수동으로 감지하고 프로세스의 pid가 계속 표시되는지 확인하는 것입니다. 다음과 같이 짧은 실행 가능한 bash 스크립트에 모든 논리를 넣으십시오.
#!/bin/bash
/usr/bin/python my_script.py >> file.log & # launch process in background
my_proc_pid="$!" # save process pid for last executed command
prevtime=0 # initialize "previous modification time" variable
while : ; do
sleep 1 # check log file modification time every 1s
# modification time in milliseconds
if (( $(\find /path/to/file.log/ -name file.log -printf "%T") - prevtime > 30000)); then
#if (( "$(\ls -l --time-style=+%s /path/to/logfile/file.log | cut -d' ' -f6)" - prevtime > 30)); then
prevtime="$(\find /path/to/file.log/ -name file.log -printf \"%T\")"
#prevtime="$(\ls -l --time-style=+%s /path/to/logfile/file.log | cut -d' ' -f6)"
if (\ps | grep -v grep | grep "$my_proc_pid" &>/dev/null) ; then
# kill process in background, '&>' same as '>/dev/null 2>&1'
/usr/bin/kill -9 "$my_proc_pid" &>/dev/null
fi
# launch process and save its pid
/usr/bin/python my_script.py >> file.log &
my_proc_pid="$!"
fi
done
# use CTRL-C to stop loop execution and to exit script
노트:
로그 파일 수정 시간을 찾는 두 가지 방법을 제공했습니다. 주석 처리되지 않은 것들은 find
그보다 이상한 파일 이름(예: 공백 등)을 처리하는 것과 관련이 ls
있으며 파이프에 의존하지 않습니다. 이 경우 완전한 정보를 제공해야 합니다.길/path/to/logfile/
cmd의 첫 번째 인수로 로그 파일( )에 추가합니다 find
. 이 경우 ls
아래와 같이 전체 로그 파일의 파일 이름과 함께 동일한 경로를 제공해야 합니다./path/to/logfile/file.log
bash
v5.0.1에서 부분적으로 테스트했습니다 . 문제가 있으면 신고해 주세요. 화타이