使用 cron 按计划停止/启动特定服务的最佳方法是什么?
我尝试运行service servicename stop
一个 cron 任务,但似乎不起作用,所以我改用/etc/init.d/servicename
0 19 * * * /etc/init.d/servicename stop >/dev/null 2>&1
0 7 * * * /etc/init.d/servicename start >/dev/null 2>&1
看起来这有效,但不确定效果如何。
但奇怪的是,我收到一封来自 cron 的电子邮件,其中有以下错误:
/bin/sh: line 1: 20178 Terminated /etc/init.d/servicename start > /dev/null 2>&1
我似乎只在启动服务时遇到此错误。停止服务似乎没问题。
我还认为应该>/dev/null 2>&1
禁止通过电子邮件发送通知。不过,在这种情况下,我很高兴它没有这样做。
有谁知道更好的按计划停止/启动服务的方法吗,希望使用 cron?
有谁知道这个错误是怎么回事吗?
谢谢
答案1
是的,处理这个问题的更好方法是使用作业控制实用程序(例如 Monit)它适用于 CentOS,是一种干净的方式来确保您的守护进程在需要时运行,并可用于按计划启动/停止单个或一组服务(通过 cron)...我看到 cron 失败的例子是当服务窗口内发生某些事情时(应用程序崩溃等)。
这是 CUPS 打印服务的一个示例...
在某个 Monit 配置文件中,我会有一个定义 CUPS 服务的节,包括其 PID 和启动和停止命令。
check process cups
with pidfile "/var/run/cupsd.pid"
start program = "/sbin/service cups start"
stop program = "/sbin/service cups stop"
跑步monit status
Process 'cups'
status Running
monitoring status Monitored
pid 2357
parent pid 1
uptime 8d 6h 43m
.
.
data collected Mon, 13 Aug 2012 09:07:03
运行monit stop cups
停止服务...
Process 'cups'
status Not monitored
monitoring status Not monitored
data collected Mon, 13 Aug 2012 09:08:03
monit start cups
启动它。我通常在 crontab 中添加 monit start 和 stop 命令来处理应用程序的启动和关闭。Monit 将确保服务在这些时间也在运行(例如中午重启后)...
答案2
您应该能够使用/sbin/service
...事实上,这是一个好习惯,因为 RHEL/CentOS/etc 的下一个版本可能会使用它systemd
来代替旧/etc/init.d
脚本。如果调用/sbin/service
不起作用,您可能需要查看命令生成的任何错误输出。
Terminated
您收到的错误可能是服务控制脚本存在错误...如果它执行了类似操作,可能killall servicename
会无意中终止控制脚本,从而导致此错误。您仍然看到错误输出,因为此错误消息来自开始cron
运行命令的 shell,而不是来自命令本身。如果这是这里发生的情况,您可能需要查看 init 脚本并查看是否可以解决问题。
当调试错误时,有时将 重定向到文件而不是 是一个好主意stdout
(stderr
尽管/dev/null
在这种情况下这没有帮助)。