ファイルが更新されるのを待ちますが、時間しきい値を超えると終了するwhileループを持つBashスクリプト

ファイルが更新されるのを待ちますが、時間しきい値を超えると終了するwhileループを持つBashスクリプト

私はbashをかなりよく知っているので、この質問が解決しやすい場合はお詫び申し上げます。詳細が必要な場合はお知らせください。以下のスクリプトは、Pythonワークフローを起動し、ワークフローの終了時にresults.jsonファイルが更新されるのを待つ大きなスクリプトの一部です。

使ってみました。

{
    sleep 1m
    kill $$
}&

ただし、results.jsonファイルが1分以内に更新されると、エラーが生成されます。

Kill:(90015) - そのプロセスはありません。

スクリプトは次のとおりです。

#! /bin/bash
export DISPLAY=:0.0

export outputfile=results.json

if [[ ! -e $outputfile ]]; then
    touch $outputfile
fi

OldTimestamp=$(date -r $outputfile)

{
    sleep 1m
    kill $$
}&

NewTimestamp=$OldTimestamp; 
while [ "$NewTimestamp" = "$OldTimestamp" ]; do 
   sleep 0.1
   NewTimestamp="$(date -r $outputfile)" 
done

ベストアンサー1

ただ取り除きたいならKill:(90015) - そのプロセスはありません。エラー、プロセスを終了する前に、プロセスがまだ実行中であることを確認できます。

{
    sleep 1m
    ps -p $$ > /dev/null && kill $$
}&

しかし、実際に私はkillをまったく使用しません。 whileループの相互作用の数を追跡し、適切な反復数の後にループを中断することができます。

NewTimestamp=$OldTimestamp; 
iterations=0
while [ "$NewTimestamp" = "$OldTimestamp" ] && [ $iterations -lt 600 ]; do
   sleep 0.1
   NewTimestamp="$(date -r $outputfile)"
   let iterations++
done

ファイルが更新されていない場合、ゼロ以外の終了コードで終了するには、次のように追加します。

if [ "$NewTimestamp" = "$OldTimestamp" ] ; then 
    echo "results.json was not updated" >&2
    exit 1
fi

またはそのようなもの。

おすすめ記事