我有这个用户crontab(通过命令crontab -e访问):
# m h dom mon dow command
*/3 * * * * sh /home/FRAPS/Desktop/cronCheck.sh
脚本cronCheck.sh看起来像这样:
#!/bin/sh
SERVICE='Script'
if ps ax | grep -v grep | grep -i "$SERVICE" > /dev/null
then
echo "######## $SERVICE service running, everything is fine ##################\n" >> CronReport.txt
else
echo "$SERVICE is not running. Launching it now\n" >> CronReport.txt
perl Script.pl
fi
当我从自己的目录启动脚本(cronCheck.sh)时,它就像一个魅力,但是当cron启动时,它总是“#$ SERVICE service running,一切都很好###” 尽管'脚本'没有运行。
谢谢,
答案 0 :(得分:2)
您需要将grep -v grep
放在 grep -i "$SERVICE"
之后。你现在拥有它的方式是保证是真的。
答案 1 :(得分:2)
这是编写该条件的更好方法:
services=$(ps -e -o comm | grep -cFi "$SERVICE")
case "$services" in
(0)
# restart service
;;
(1)
# everything is fine
;;
(*)
# more than one copy is running
;;
esac
通过使用ps -e -o comm
,您可以避免执行愚蠢的grep -v grep
事情,因为只有实际的进程名称出现在ps输出中,而不是参数。 grep -cFi
计算匹配并给出一个数字,因此您不必处理管道的退出状态。
此外,正如其他海报所暗示的那样,您应该通过设置PATH
变量来引导此脚本。
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
您可能会或可能不想将/usr/local/bin
放在该列表的开头,具体取决于您的系统。如果你不需要任何东西,不要这样做。
最后的建议:当编写将在没有用户监督的情况下执行的脚本(例如cron作业)时,最好将set -e
放在开头。如果任何命令失败,这会使它们退出失败。
答案 2 :(得分:1)
检查管道的返回状态可能会有问题。你应该检查$ PIPESTATUS数组,或者你可以将最终的grep传递给wc -l来计算行数。
答案 3 :(得分:1)
cron通常不像用户帐户那样设置很多环境。您可能需要修改脚本以正确设置。
答案 4 :(得分:1)
Cron作业没有获得在shell提示符下获得的相同环境设置 - 这些设置通常由您的shell在登录时设置 - 因此您希望始终使用绝对路径而不是相对路径。 (即不要假设PATH环境变量将存在或设置为与shell提示符相同,并且不要假设脚本将在PWD设置到您的主目录时运行,等等)。所以:
sh
替换为/bin/sh
(如果cronCheck.sh是可执行的,则将其删除,shebang行将执行此操作)。 cronCheck.sh最终会看起来像:
#!/bin/sh
SERVICE='Script'
if ps ax | grep -v grep | grep -i "$SERVICE" > /dev/null
then
echo "######## $SERVICE service running, everything is fine ##################\n" >> CronReport.txt
else
# Specify absolute path to a log file that's writeable for the user the
# cron runs as (probably you). Example: /tmp/CronReport.txt
echo "$SERVICE is not running. Launching it now\n" >> /tmp/CronReport.txt
# Specify absolute path to both perl and the script. Example: /usr/bin/perl
# and /home/FRAPS/scripts/Script.pl
/usr/bin/perl /home/FRAPS/scripts/Script.pl
fi
(如果Script.pl是可执行的,你可以摆脱/ usr / bin / perl位,并且在shebang行中有正确的perl路径。)