下面的脚本对吗???直到昨天为止一切都还好!
我编写了以下脚本来帮助 cron 作业每分钟运行一次并调用其他一些脚本,这可能会导致命令被执行多次,预期的行为是有 4 个作业进程,任何更少或更多的东西都应该是导致重新启动,所以请告诉我以下脚本是否正确?
#! /bin/bash
case "$(pidof command | wc -w)" in
0) echo "Restarting command: $(date)" >> log
/usr/bin/sh x.sh
;;
4) # all ok
echo "All OK" >> log
;;
*) for pid in $(ps -ef | grep "x" | grep "y" | awk '{print $2}'); do kill -9 $pid; done
echo "Removed PIDs and RESTARTING FFMPEG: $(date)" >> /root/afarinEidSTs/log
/usr/bin/sh x.sh
;;
esac
即使进程超过 4 个,它也不会杀死进程,为什么?
在日志文件中,我只会看到"Restarting command: $(date)"
.
这很奇怪,因为 pidofffmpeg | wc -w
将显示 23,但脚本并没有杀死所有并重新启动它们!
我也尝试过使用([0-3])
而不是0)
像@jordanm所说的那样,但没有帮助。
答案1
这可能是因为你的 cron 或你用来完成工作的东西无法执行你使用过的所有命令。要解决此问题,我建议您使用任何命令的绝对路径 - 通过使用which pidof
, which grep
&c 获取:
#!/bin/bash
case "$(/usr/sbin/pidof command | /usr/sbin/wc -w)" in
0) echo "Restarting command: $(date)" >> log
/usr/bin/sh x.sh
;;
4) # all ok
echo "All OK" >> log
;;
*) for pid in $(/usr/sbin/ps -ef | /usr/sbin/grep "x" | /usr/sbin/grep "y" | /usr/sbin/awk '{print $2}'); do kill -9 $pid; done
echo "Removed PIDs and RESTARTING FFMPEG: $(date)" >> /root/afarinEidSTs/log
/usr/bin/sh x.sh
;;
esac
仔细检查系统中的完整路径。