start() に対して以下を指定する crond を起動する init.d スクリプトがあります。
start-stop-daemon -S --quiet --make-pidfile --pidfile /var/run/crond.pid --background --exec /usr/sbin/crond
しかし、PIDはいつも/var/run/crond.pidに記録されている数より1桁高いです。ここで何が起こっているのか知っている人はいますか?同じ呼び出しを実行する約10の異なる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, ...
記録されたPIDはstart-stop-daemon
親プロセスのPIDです。分岐間の短い時間内に他のプロセスが分岐しない場合、子プロセスのPIDは最終的に親プロセスのPIDに1を加えた値になります。
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