タイムアウト後にbashスクリプトを自動的に終了するには?

タイムアウト後にbashスクリプトを自動的に終了するには?

次のような多くのタスクを実行するbashスクリプトがありますscript.sh

#!/bin/bash
#It
#Is
#Doing
#Things

スクリプト内でスクリプトのプロセスIDを取得してから5分後に終了する方法はありますか?

良い:

#!/bin/bash
#Get pid of script.sh here, start a 5 minute timer and kill the script after time runs out
#It
#Is
#Doing
#Things

答え1

timeoutGNU coreutilsのユーティリティは次のことを行います。

timeout 5m bash script.sh

スクリプトは実行後5分後に終了します。

答え2

でPIDを取得できますPID=$$

あなたが望むのは、おそらくコマンドを使用して最も簡単に得ることですtimeout

ただし、バックグラウンドプロセスを実行することもできます。

(sleep $TIMEOUT && kill "$PID") &

答え3

常に5分後にスクリプトがタイムアウトするようにするには、次のようにバックグラウンドプロセスでブロックを使用します。Ctrl+C実行中にバックグラウンドプロセスを使用すると、バックグラウンドプロセスも終了します。

#!/bin/bash
{
    sleep 5m
    kill $$
} &

while true
do
    date
    sleep 1
done

答え4

確認条件を使用できます。

#!/bin/bash

START=$(date +%s)

while [[ $(($(date +%s) - $START)) -lt 300 ]]
do
    #do something here
done

echo QUIT

説明する

  • date +%sエポック以降の秒数を取得し、STARTスクリプトの開始時刻を示す変数に保存します。
  • [[ $(($(date +%s) - $START)) -lt 300 ]]:現在時刻からdate +%s開始時刻を引いた値を(再度)取得します(START変数に保存されます)。
  • 結果が5分未満の場合、300スクリプトは引き続き実行されます。
  • 結果が同じか大きい場合は、300開始時間以降にスクリプトが実行されていることを意味し、ループを5 minutes終了しwhileてスクリプトを終了します。

関連情報