script.sh
と呼ばれる多くのことを行うbashスクリプトがあります。
#!/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
スクリプトを常に5分後にタイムアウトさせたい場合は、このようなバックグラウンドプロセスでブロックを使用するだけです。実行中にCtrl+C
を使用すると、バックグラウンドプロセスも終了します。
#!/bin/bash
{
sleep 5m
kill $$
} &
while true
do
date
sleep 1
done
PID=$$
でPIDを取得します。
コマンドtimeout
を使用すると、最も簡単に目的を達成できます。
ただし、バックグラウンドプロセスを実行することもできます。
(sleep $TIMEOUT && kill "$PID") &
GNU coreutilsの一部であるtimeout
ユーティリティはあなたのためにそれを行います:
timeout 5m bash script.sh
実行の5分後にスクリプトを終了します。
ループを次のように変更できます。
#!/bin/bash -
SECONDS=0
while ((SECONDS < 5*60))
do
echo "line printed"
done
または、最も深いループ内に((SECONDS < 5*60)) || exit
を挿入します。
SECONDS
のksh
、zsh
およびbash
は、毎秒インクリメントされる特別な変数です。
チェック条件を使用できます。
_#!/bin/bash
START=$(date +%s)
while [[ $(($(date +%s) - $START)) -ne 300 ]]
do
#do something here
done
echo QUIT
_
説明
date +%s
_エポックからの時間を秒単位で取得し、START
変数に保存して、スクリプトの開始時間をマークします。[[ $(($(date +%s) - $START)) -ne 300 ]]
:現在の時刻(_date +%s
_を再度)から開始時刻を減算します(START
変数に保存されています)。300
_(5分)と等しくない場合、スクリプトは実行を続け、300
_と等しい場合、つまり、スクリプトが開始時間から_5 minutes
_を実行したことを意味し、while
ループを終了し、スクリプトは終了します。