运行 cron 本身是否与通过 init.d 脚本具有相同的行为?

运行 cron 本身是否与通过 init.d 脚本具有相同的行为?

我正在使用一些代码来启动服务器上的 cron(该服务器在启动时不会运行它)。启动 cron 的脚本会设置一些日志记录内容,然后简单地调用cron。它不使用/etc/init.d/cronservice 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,总结如下:

  1. start操作仅/usr/sbin/cron通过/sbin/start-stop-daemon助手调用,
  2. stop操作仅发送SIGTERM到 pidfile 中的 PID(通过/sbin/start-stop-daemon),
  3. 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不会终止计划任务您创建的实例。

相关内容