Bash - 检查进程是否正在运行,否则启动它并使用“switch”情况发送邮件

时间:2014-02-27 15:06:52

标签: linux bash email cron centos

所以我有一个小脚本来检查进程是否正在运行,如果没有,则启动脚本并向我发送邮件。我写的脚本(and is "inspired" from here)如下:

#!/bin/bash

case "$(pidof webrtc2sip | wc -w)" in

0)  echo "Restarting WebRTC2SIP:     $(date)" >> /var/log/webrtc2sip.txt
    echo "Restarting WebRTC2SIP at $(date)" > test.txt
    /opt/webrtc2sip/sbin/webrtc2sip --config=/opt/webrtc2sip/sbin/config.xml &
    mail -r webrtc2sip@testserver.net -s "ALERT: webRTC2sip restarted" me@testserver.com  < test.txt
    ;;
1)  # all ok
    ;;
*)  echo "Removed multiple WebRTC2SIP: $(date)" >> /var/log/webrtc2sip.txt
    echo "Removed multiple WebRTC2SIP at $(date)" > test1.txt
    kill $(pidof webrtc2sip | awk '{print $1}')
    mail -r webrtc2sip@testserver.net -s "ALERT: webRTC2sip multiple processes killed"  me@testserver.com  < test1.txt
    ;;
esac

我为此设置了一个cron,每分钟执行一次(* * * * * /path/to/script)。

现在,我认为正在发生的事情是,第一个案例正在重复执行。我不确定,因为webrtc2sip PID不会改变,但我每分钟都会收到第一封邮件“ALERT:webRTC2sip”。

我在哪里弄错了?我应用的逻辑中是否有错误?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为Gurubaran大部分都是对的。我认为根本原因是你的简单kill不会终止进程(正如我在测试时发生的那样),因此webrtc2sip的运行实例数量不会减少。请尝试kill -kill,看看是否能解决您的问题。

此外,您的代码每分钟仅处理一个额外的webrt2cip实例。这可能会更好:

case "$(pidof webrtc2sip | wc -w)" in

0)  echo "Restarting WebRTC2SIP:     $(date)" >> /var/log/webrtc2sip.txt
echo "Restarting WebRTC2SIP at $(date)" > test.txt
/opt/webrtc2sip/sbin/webrtc2sip --config=/opt/webrtc2sip/sbin/config.xml &
mail -r webrtc2sip@testserver.net -s "ALERT: webRTC2sip restarted" me@testserver.com  < test.txt
;;
1)  # all ok
;;
*)  echo "Removed multiple WebRTC2SIP: $(date)" >> /var/log/webrtc2sip.txt
echo "Removed multiple WebRTC2SIP at $(date)" > test1.txt
while [ $(pidof webrtc2sip | wc -w) -ne 1 ]
do
  kill -kill $(pidof webrtc2sip | awk '{print $1}')
done
mail -r webrtc2sip@testserver.net -s "ALERT: webRTC2sip multiple processes killed"  me@testserver.com  < test1.txt
;;

esac`

答案 1 :(得分:0)

是的我也这么认为..如果有多个进程,那么你想确保你想要杀死所有进程......否则你会比你预期的更多地陷入这个*)。 darylbnz解决方案应该正常工作。您也可以尝试'kill -9'并确保该进程被终止。