인쇄되지 않으면 쉘 스크립트를 다시 시작하십시오

인쇄되지 않으면 쉘 스크립트를 다시 시작하십시오

루프에서 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

bashv5.0.1에서 부분적으로 테스트했습니다 . 문제가 있으면 신고해 주세요. 화타이

관련 정보