Linux Shell脚本没有';无法从cron作业执行

Linux Shell脚本没有';无法从cron作业执行,linux,shell,cron,jobs,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

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 
文件可执行文件,从根用户运行

命令:

bash /etc/mycron/checkServices.sh
尝试了sh和just
/etc/mycron/checkServices.sh

不跑

#!/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告诉可执行加载程序,如果调用
bash/etc/mycron/checkServices.sh,将使用
/bin/sh
加载文件。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”
,因为这更一般

在这里工作很好。。。也许您想在
之后添加/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告诉可执行加载程序,如果调用
bash/etc/mycron/checkServices.sh,将使用
/bin/sh
加载文件。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”
,因为这是一个更一般的诊断过程,在脚本中插入跟踪语句是明智的,例如:

  • 回声“开始…”
  • echo“正在检查正在运行的服务“$service…”
  • 服务在哪里
  • “echo”服务已启动
  • 暂时删除
    ps
    /dev/null
然后在cron下执行,将stdout和stderr重定向到日志文件


这使您能够识别出故障的确切线路。正如其他人所说,可能是因为路径未设置为包含“service”或“$service”命令,所以找不到它们。您是否意识到“服务”本身被视为一个外部命令,可能会依次启动$service?还要注意root的邮件,因为cron有时会通过邮件发送错误报告。

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

  • 回声“开始…”
  • echo“正在检查正在运行的服务“$service…”
  • 服务在哪里
  • “echo”服务已启动
  • 暂时删除
    ps
    /dev/null
然后在cron下执行,将stdout和stderr重定向到日志文件


这使您能够识别出故障的确切线路。正如其他人所说,可能是因为路径未设置为包含“service”或“$service”命令,所以找不到它们。您是否意识到“服务”本身被视为一个外部命令,可能会依次启动$service?还要注意root的邮件,因为cron有时会通过邮件发送错误报告。

您是否为cron作业设置了时间表?发布完整的crontab命令,制作第二行“printenv>/tmp/crontest”,并告诉我们文件的UID和路径。@Seth是正确的。cron作业在非常有限的环境中运行。“service”命令可能位于/sbin或其他位置。是否为cron作业设置了时间表?发布完整的crontab命令,制作第二行“printenv>/tmp/crontest”,并告诉我们文件的UID和路径。@Seth是正确的。cron作业在非常有限的环境中运行。“service”命令可能位于/sbin或其他位置。@lesyk回应您的编辑建议:请在此处发表评论,并多说“不起作用”。@lesyk回应您的编辑建议:请在此处发表评论,并多说“不起作用”。