7

フォルダー内のすべてのスクリプトを実行するメイン スクリプトがあります。

#!/bin/bash
for each in /some_folder/*.sh
do
  bash $each
done;

それらの 1 つの実行が長すぎる (N 秒以上) かどうかを知りたいです。たとえば、次のようなスクリプトの実行:

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

は非常に長く続くので、N 秒後にメイン スクリプトから電子メールが送信されるようにします。

私が今できることは、すべてのスクリプトを#timeout Nオプションで実行することですが、それらを停止します! スクリプトの実行を停止せずにメールで連絡することはできますか?

4

2 に答える 2

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" user@domain.tld < /dev/null
fi

バックグラウンドでコマンドを実行し、MAX_SECONDS の間スリープし、 // プロセスが許可されている以上の時間がかかる場合は電子メールで警告します。

最後に、特定の要件で:

#!/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" user@domain.tld < /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
于 2013-10-12T13:58:15.790 に答える
4

次のようなことができます。

( sleep 10 ; echo 'Takes a while' | sendmail myself@example.com ) &
email_pid=$!
bash $each
kill $email_pid

最初のコマンドは、バックグラウンドでサブシェルで実行されます。最初にしばらくスリープしてから、電子メールを送信します。スリープが切れる前にスクリプト$eachが終了すると、サブシェルは電子メールを送信せずに強制終了されます。

于 2013-10-12T14:01:23.437 に答える