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
无法运行
答案 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)
正如一般诊断过程一样,将跟踪语句插入脚本是明智的,例如:
> /dev/null
的{{1}}。然后在带有stdout的cron下执行,并将stderr重定向到日志文件。
这允许您识别失败的确切行。正如其他人所说,看起来很可能找不到“服务”或“$ service”命令,因为PATH没有设置为包含它们。你是否意识到“服务”本身正在寻求作为一个外部命令,可能会依次启动$ service?还要关注root的邮件,因为cron有时会通过邮件发送错误报告。