長いプロセスを実行している場合、時間ベースのコマンドを実行する方法はありますか?
たとえば、約10分間実行される非常に長いプロセスを実行しています。
5分後、別のコマンドを実行します。説明のために、個別のコマンドは次のようになります:echo 5 minutes complete
(注:コマンドの完了に向けて進行するのではなく、指定された間隔の後に実行されるコマンドのみです。)
出来ますか?
ただ走れ:
long-command & sleep 300; do-this-after-five-minutes
do-this-after-five-minutes
は5分後に実行されます。 long-command
はバックグラウンドで実行されます。
次のスクリプトを使用できます。
#!/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-Shell
でlongprocess
を実行し、以前に作成した「ロック」ファイルの存在を監視します。
これにはライナーが1つあります。
( ( sleep $TIMEOUT ; echo "5 minutes complete") & $COMMAND )
あなたの場合、TIMEOUT = 5mで、COMMANDは長いコマンドです。
この投稿への私の回答もご覧ください 'service network restart'でタイムアウト
#! /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がリアルタイムと同期しなくなる可能性があることに注意してください。開始時間を保存し、実際の時間との差を計算することをお勧めします。