印刷されない場合は、シェルスクリプトを再起動してください

印刷されない場合は、シェルスクリプトを再起動してください

ループで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

これを行う方法はいくつかあります。その1つは、完璧な答えに従って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

メモ: ログファイルの修正時間を見つける2つの方法を提供しました。コメントされていないものは、find奇妙なファイル名(スペースなど)を処理することに関連しており、lsパイプに依存しません。この場合、完全な情報を提供する必要があります。/path/to/logfile/cmdの最初の引数としてログファイル()に追加しますfind。この場合、ls以下のように、ログファイル全体のファイル名と同じパスを指定する必要があります。/path/to/logfile/file.log

bashv5.0.1で部分的にテストしました。問題があれば報告してください。ファタイ

おすすめ記事