2013-10-12 17 views
7

私はフォルダ内のすべてのスクリプトを実行するメインスクリプトを持っています。他のスクリプトの実行時間を見るためのBashスクリプト

いずれかの実行が長すぎる(N秒を超える)かどうかを知りたい。たとえば、次のようなスクリプトの実行:

#!/bin/bash 
ping -c 10000 google.com 

は非常に長く続き、私のメインスクリプトはN秒後に私にメールして欲しいです。

私が今できることは、すべてのスクリプトを#timeout Nオプションで実行することですが、停止させることができます。 私にメールを送り、スクリプトの実行を停止しないでください。

+0

これらをすべて並列に実行するのは問題ですか(ロードワイズなど)?あなたはバックグラウンドでそれらを同時に動かすことができ、それらをチェックすることができます。 – Wrikken

答えて

4

あなたはこのような何かを行うことができます。最初はしばらく寝てからメールを送信します。スリープが切れる前にスクリプト$eachが終了すると、電子メールを送信せずにサブシェルが殺されます。

7

はこれを試してみてください:

#!/bin/bash 

# max seconds before mail alert 
MAX_SECONDS=3600 

# running the command in the background and get the pid 
command_that_takes_a_long_time & _pid=$! 

sleep $MAX_SECONDS 

# if the pid is alive... 
if kill &>/dev/null -0 $_pid; then 
    mail -s "script $0 takes more than $MAX_SECONDS" [email protected] < /dev/null 
fi 

は、我々はプロセスが許可されているものよりも多くを要する場合、電子メールで//でMAX_SECONDSとアラートの眠り、その後、バックグラウンドでコマンドを実行します。特定の要件と最後に

、:

(sleep 10 ; echo 'Takes a while' | sendmail [email protected]) & 
email_pid=$! 
bash $each 
kill $email_pid 

最初のコマンドは、バックグラウンドでサブシェルで実行されます。

#!/bin/bash 

MAX_SECONDS=3600 

alerter(){ 
    bash "$1" & _pid=$! 
    sleep $MAX_SECONDS 
    if kill &>/dev/null -0 $_pid; then 
     mail -s "$2 takes more than $MAX_SECONDS" [email protected] < /dev/null 
    fi 
} 

for each in /some_folder/*.sh; do 
    alerter "$each" & 
    wait $_pid # remove this line if you wou'd like to run all scripts in // 
done 
+0

これはOPが尋ねたものとは反対に、実行中のスクリプトを強制終了しませんか? – Thomas

+0

申し訳ありませんが、 '-0'は忘れてしまいました(pidがまだ生きているかどうかをテストするだけで、それはkillしません) –

関連する問題