web-dev-qa-db-ja.com

start-stop-daemonは、間違ったpidでcronpidfileを作成します

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つ大きい数値。誰かがここで何が起こっているのか考えていますか?同じ呼び出しを行う他のinit.dスクリプトが約10個ありますが、この問題が発生しているのは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
#
4
trycatch

crondプログラムは、デーモンになるように設計されています。開始すると、最初に行うことの1つは、子をフォークして親を終了します。これは、デーモンがバックグラウンドで実行を継続する必要があるのに対し、呼び出し元がプログラムの終了を待ってから続行する環境向けに設計されています。

caller ---- fork--> wait -------------------------+-> ...
             |                                    |
             '----> exec crond ---- fork--> exit -'
                                     |
                                     '----> read crontab, wait for time of next job, ...

start-stop-daemonによって記録されたPIDは、親のPIDです。 2つのフォーク間の短い間隔の間に他のプロセスフォークがない場合、子の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