我正在使用一些代码来启动服务器上的 cron(该服务器在启动时不会运行它)。启动 cron 的脚本会设置一些日志记录内容,然后简单地调用cron
。它不使用/etc/init.d/cron
或service cron start
。
以这种方式启动 cron 后,service cron status
似乎service cron stop
能够顺利工作,并且指定的 PIDFILE 也/etc/init.d/cron
存在。
我把一行日志放入其中/etc/init.d/cron
,看起来cron
独立运行并不会调用该脚本。
# service cron status
script is running
* cron is running
# service cron stop
script is running
* Stopping periodic command scheduler cron [ OK ]
# cron
#
这是怎么回事?这仅仅是因为cron
二进制文件和 /etc/init.d/cron 脚本对 pidfile 的位置使用了相同的约定吗?
答案1
你的假设是正确的:维克西·克朗有一个固定的 pidfile 位置(/var/run/crond.pid
),这也可以防止运行两次。
这初始化文件脚本,也称为service
使用标准/lib/lsb/init-functions
,总结如下:
- 该
start
操作仅/usr/sbin/cron
通过/sbin/start-stop-daemon
助手调用, - 该
stop
操作仅发送SIGTERM
到 pidfile 中的 PID(通过/sbin/start-stop-daemon
), - 该
status
行动相当于kill -0 $(cat /var/run/crond.pid)
。
但是,如果你有systemd安装后,标准 init 函数被重写/lib/lsb/init-functions.d/40-systemd
并运行计划任务直接不再被检测到:
piotr@bialykiel:~$ sudo /usr/sbin/cron
piotr@bialykiel:~$ sudo /etc/init.d/cron status
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Sun 2020-02-02 09:12:43 CET; 5min ago
Docs: man:cron(8)
Process: 734 ExecStart=/usr/sbin/cron -f $EXTRA_OPTS (code=killed, signal=TERM)
Main PID: 734 (code=killed, signal=TERM)
自从systemd想要有一个CGroup
每项服务。更糟糕的是start
,它restart
不起作用,因为计划任务将会在已经存在的 pidfile 上失败,并且stop
不会终止计划任务您创建的实例。