
次のような多くのタスクを実行する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
timeout
GNU 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
てスクリプトを終了します。