我有一个 init.d 脚本来启动 crond,它为 start() 指定了以下内容:
start-stop-daemon -S --quiet --make-pidfile --pidfile /var/run/crond.pid --background --exec /usr/sbin/crond
然而,PID是总是比 /var/run/crond.pid 中记录的数字高一个数字。有谁知道这里发生了什么事吗?我还有大约十个其他 init.d 脚本也进行相同的调用,并且只有 cron.d 存在此问题。
编辑: 这很有趣:
# /usr/sbin/crond &
#
[1]+ Done /usr/sbin/crond
# echo $!
737
# ps -eaf | grep crond
738 root /usr/sbin/crond
740 root grep crond
#
答案1
该crond
程序被设计为守护程序。当它启动时,它做的第一件事就是分叉一个子进程并退出父进程。这是为调用者在继续之前等待程序退出而守护进程需要继续在后台执行的环境而设计的。
caller ---- fork--> wait -------------------------+-> ...
| |
'----> exec crond ---- fork--> exit -'
|
'----> read crontab, wait for time of next job, ...
记录的PIDstart-stop-daemon
是父进程的PID。如果在两次派生之间的短时间内没有其他进程派生,则子进程的 PID 最终将是父进程的 PID 加一。
由于start-stop-daemon
设计是为了处理守护进程并让它们在后台运行,所以告诉crond
它们留在前台,即不要在开始时分叉。
caller ---- fork--> store pid; ...
| |
'----> exec crond -f ----> read crontab, wait for time of next job, ...
使用 BusyBox 的 crond,将-f
选项传递给它。
start-stop-daemon -S --quiet --make-pidfile --pidfile /var/run/crond.pid --background --exec /usr/sbin/crond -- -f