【问题标题】:Shell script doesn't execute from cron jobShell 脚本不会从 cron 作业执行
【发布时间】:2011-06-14 00:20:09
【问题描述】:

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

没有运行

【问题讨论】:

  • 您是否为 cron 作业设置了时间表?发布完整的 crontab 通信
  • 制作第二行“printenv > /tmp/crontest”并告诉我们文件是什么UID以及你的PATH是什么。
  • @Seth 是对的。 cron 作业在非常有限的环境中运行。 “服务”命令可能在 /sbin 或其他东西下。

标签: linux shell cron jobs


【解决方案1】:
#!/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你将启动bash,轮到他启动/bin/sh 最终执行您的脚本。

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

【讨论】:

  • @lesyk 回应您的编辑建议:请在此处发表评论,并说更多而不是“不起作用”。
【解决方案2】:

就像一般诊断过程一样,在脚本中插入跟踪语句是明智的,例如:

  • 回显“开始...”
  • echo "正在检查正在运行的服务 '$service'..."
  • 哪个/在哪里服务
  • echo "服务已启动。"
  • 暂时删除> /dev/nullps

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

这使您可以确定发生故障的确切行。正如其他人所说,看起来可能是找不到“服务”或“$service”命令,因为 PATH 未设置为包含它们。您确实意识到“服务”本身正在被寻求作为可能依次启动 $service 的外部命令?还要留意 root 的邮件,因为 cron 有时会通过邮件发送错误报告。

【讨论】: