Shell脚本不从cron作业执行

时间:2011-06-14 00:20:09

标签: linux shell cron jobs

shell脚本:

#!/bin/sh
services=( httpd named proftpd mysqld dovecot postfix webmin)

for service in ${services[@]}
do

if ps ax | grep -v grep | grep $service > /dev/null
then
    echo "$service service running, everything is fine"     
else
    echo "$service is not running"
    service $service start
fi

done 

文件可执行文件,从root用户运行

命令:

bash /etc/mycron/checkServices.sh

尝试了sh而只是/etc/mycron/checkServices.sh

无法运行

2 个答案:

答案 0 :(得分:5)

#!/bin/sh
services=( httpd named proftpd mysqld dovecot postfix webmin)

for service in ${services[@]}; do
    if ps ax | grep -v grep | grep $service > /dev/null; then
        echo "$service service running, everything is fine";
    else
        echo "$service is not running";
        service $service start;
    fi;
done;

在这里工作正常......也许你想在#!/bin/sh PATH="/bin:/sbin:/usr/bin:/usr/sbin:/opt/usr/bin:/opt/usr/sbin:/usr/local/bin:/usr/local/sbin"

之后添加

你也可以chmod 775 /etc/mycron/checkServices.sh使其成为可执行文件,这是cron所需要的。然后你也不需要调用bash /etc/mycron/checkServices.sh并且可以调用/etc/mycron/checkServices.sh #!/bin/sh如果你调用/bin/sh bash /etc/mycron/checkServices.sh告诉可执行加载程序用/bin/sh加载文件你将启动bash,然后轮流启动$IFS以最终执行你的脚本。

由于bash / sh中的for循环使用IFS变量(services=(httpd named proftpd mysqld dovecot postfix webmin))作为分隔符,因此您还可以将行services="httpd named proftpd mysqld dovecot postfix webmin"设为{{1}},因为这是更通用的

答案 1 :(得分:1)

正如一般诊断过程一样,将跟踪语句插入脚本是明智的,例如:

  • echo“Starting ...”
  • echo“正在检查运行服务'$ service'......”
  • / whereis service
  • echo“服务已经开始。”
  • 暂时删除> /dev/null的{​​{1}}。

然后在带有stdout的cron下执行,并将stderr重定向到日志文件。

这允许您识别失败的确切行。正如其他人所说,看起来很可能找不到“服务”或“$ service”命令,因为PATH没有设置为包含它们。你是否意识到“服务”本身正在寻求作为一个外部命令,可能会依次启动$ service?还要关注root的邮件,因为cron有时会通过邮件发送错误报告。