web-dev-qa-db-ja.com

タイムアウト後にbashスクリプトを自己終了させる方法は?

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
4
MLSC

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

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

while true
do
    date
    sleep 1
done
5
blujay

PID=$$でPIDを取得します。

コマンドtimeoutを使用すると、最も簡単に目的を達成できます。

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

(sleep $TIMEOUT && kill "$PID") &
15
Hauke Laging

GNU coreutilsの一部であるtimeoutユーティリティはあなたのためにそれを行います:

timeout 5m bash script.sh

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

15
devnull

ループを次のように変更できます。

#!/bin/bash -
SECONDS=0
while ((SECONDS < 5*60))
do
  echo "line printed"
done

または、最も深いループ内に((SECONDS < 5*60)) || exitを挿入します。

SECONDSkshzshおよびbashは、毎秒インクリメントされる特別な変数です。

5

チェック条件を使用できます。

_#!/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ループを終了し、スクリプトは終了します。
4
cuonglm