bash - 新的 cron 脚本用于检查 davmail pid,如果正在运行则不执行任何操作。如果没有运行重启

标签 bash

根据我在谷歌上搜索到的一个脚本采用了这个脚本,但是如果 Davmail 正在运行,该脚本就会杀死它。如果 Davmail 未运行,则脚本不会启动它。我究竟做错了什么?我已通过运行 pgrep -f davmail | wc -w 验证了状态代码

    #!/bin/bash
case "$(pgrep -f davmail | wc -w)" in

0) echo "Restarting DavMail:        $(date)" >> /var/log/davmail.txt
   /home/user/Downloads/davmail-linux-x86_64-4.8.0-2479/davmail.sh &
   ;;
1) # all ok
   ;;
*) echo "Removed double Davmail:    $(date)" >> /var/log/davmail.txt
   kill $(pgrep -f davmail | awk '{print $1}')
   ;;
esac

最佳答案

I've verified the status codes by running pgrep -f davmail | wc -w

这不是验证状态代码的方式。 您可以通过检查 $? 的值来验证状态代码。

但这里真正的问题是 wc -w 的输出用空格填充,并且您在 case "..."in 中对值进行了双引号, 因此只有 *) 会匹配。

另一个问题是,虽然评论说“Removed double Davmail”, 那里的命令将杀死所有匹配的进程, 不仅仅是“双Davmail”。 如果您打算保留一个进程并杀死所有其他进程, 你需要解决这个问题。

这是解决上述问题的一种方法:

count=$(pgrep -f davmail | wc -w)
if [ $count = 0 ]; then
    echo "Restarting DavMail:        $(date)" >> /var/log/davmail.txt
    /home/user/Downloads/davmail-linux-x86_64-4.8.0-2479/davmail.sh &
elif [ $count != 1 ]; then
    echo "Removed double Davmail:    $(date)" >> /var/log/davmail.txt
    kill $(pgrep -f davmail | sed -e 1d)
fi

关于bash - 新的 cron 脚本用于检查 davmail pid,如果正在运行则不执行任何操作。如果没有运行重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45927465/

相关文章:

perl - 我如何在 Perl 的 system() 中使用 bash 语法?

bash - 如何关闭 bash 的 "readline arguments"字符重复?

bash - 在 bash 中执行生成的命令

arrays - Bash:计算关联数组中键的总数?

bash - 如何使用 bash 测试文件系统的目录限制

ruby - 如何使用 bash cli(无 ruby​​)为 Travis CI 配置加密 API key ?

bash - Unix 中的 "./"运算符是什么?

linux - Bash 循环脚本运行良好,但在使用源代码运行时会出现语法错误

Linux tr 命令没有按预期工作

linux - 需要 grep 和整数表达式