start-stop-daemon faz o cron pidfile com pid errado

4

Eu tenho um script init.d para iniciar o crond, que especifica o seguinte para start ():

start-stop-daemon -S --quiet --make-pidfile --pidfile /var/run/crond.pid --background --exec /usr/sbin/crond

No entanto, o PID é sempre um número maior do que o registrado em /var/run/crond.pid. Alguém tem alguma ideia do que está acontecendo aqui? Eu tenho aproximadamente dez outros scripts init.d que também fazem as mesmas chamadas, e apenas o cron.d tem esse problema.

EDITAR: Isso é interessante:

# /usr/sbin/crond &
#
[1]+  Done                       /usr/sbin/crond
# echo $!
737
# ps -eaf | grep crond
738 root     /usr/sbin/crond
740 root     grep crond
#
    
por trycatch 03.06.2013 / 18:14

1 resposta

5

O programa crond foi projetado para ser daemon. Quando começa, uma das primeiras coisas que faz é bifurcar um filho e sair do pai. Isso é projetado para ambientes em que o responsável pela chamada está aguardando a saída do programa antes de prosseguir, enquanto o daemon precisa continuar executando em segundo plano.

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

O PID registrado por start-stop-daemon é o PID do pai. Se nenhum outro processo se bifurca durante o curto intervalo entre os dois garfos, o PID da criança acaba sendo o PID do pai mais um.

Como start-stop-daemon é projetado para manipular daemons e permitir que eles sejam executados em segundo plano, informe crond para ficar em primeiro plano, ou seja, não para bifurcar no começo.

caller ---- fork--> store pid; ...
             |                                    |
             '----> exec crond -f ----> read crontab, wait for time of next job, ...

Com o crond do BusyBox, passe a opção -f .

start-stop-daemon -S --quiet --make-pidfile --pidfile /var/run/crond.pid --background --exec /usr/sbin/crond -- -f
    
por 03.06.2013 / 21:02