web-dev-qa-db-ja.com

一定時間が経過した後にコマンドを実行しますか?

長いプロセスを実行している場合、時間ベースのコマンドを実行する方法はありますか?

たとえば、約10分間実行される非常に長いプロセスを実行しています。

5分後、別のコマンドを実行します。説明のために、個別のコマンドは次のようになります:echo 5 minutes complete

(注:コマンドの完了に向けて進行するのではなく、指定された間隔の後に実行されるコマンドのみです。)

出来ますか?

27

ただ走れ:

long-command & sleep 300; do-this-after-five-minutes

do-this-after-five-minutesは5分後に実行されます。 long-commandはバックグラウンドで実行されます。

34
Wildcard

次のスクリプトを使用できます。

#!/bin/bash

TEMPFILE="$(mktemp)"
STARTTIME="$(date +%s)"
(./longprocess; rm -f "$TEMPFILE") &
while [ -f "$TEMPFILE" ]; do
    sleep 1s
    NOW="$(date +%s)"
    if (( (NOW-STARTTIME) % 300 == 0 )); then
        echo "$(( (NOW-STARTTIME)/60 )) minute(s) elapsed"
    fi
done
echo "Done!!!"

sub-Shelllongprocessを実行し、以前に作成した「ロック」ファイルの存在を監視します。

5
Serge

これにはライナーが1つあります。

( ( sleep $TIMEOUT ; echo "5 minutes complete") & $COMMAND )

あなたの場合、TIMEOUT = 5mで、COMMANDは長いコマンドです。

この投稿への私の回答もご覧ください 'service network restart'でタイムアウト

4
coffeMug
#! /bin/bash

( sleep 4 ) & # <-- The long running process.

seconds=1
while jobs %1 &>/dev/null ; do
    echo $((seconds++)) seconds complete
    sleep 1    
done
echo Done.

jobs %1ジョブ%1が停止すると失敗します。

これより長い時間をかけると、$ secondsがリアルタイムと同期しなくなる可能性があることに注意してください。開始時間を保存し、実際の時間との差を計算することをお勧めします。

3
choroba