7

我有一个主脚本,它运行文件夹中的所有脚本。

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

我想知道其中一个的执行是否持续时间过长(超过 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

第一个命令在后台的子shell 中运行。它先睡一会儿,然后发送电子邮件。如果脚本$each在睡眠到期之前完成,则子shell 将被终止而不发送电子邮件。

于 2013-10-12T14:01:23.437 回答