Muito tarde, mas espero que isso possa ajudar outros usuários.
Existe um bug documentado no upstart que pode fazer com que o initctl rastreie o PID errado se você especificar a sub-rotina fork
incorreta em uma configuração upstart: link
O que acontece é que o upstart verifica a estrofe fork
e determina quantos processos bifurcados deve verificar antes de escolher o PID "verdadeiro" do programa que está sendo controlado. Se você especificar expect fork
ou expect daemon
, mas seu programa não for bifurcado um número suficiente de vezes, start
será interrompido. Se, por outro lado, seu processo se bifurcar muitas vezes, initctl
rastreará o PID incorreto. Teoricamente, deve ser documentado nesta seção do livro de receitas inicial , mas como você pode ver nessa situação, há um PID associado ao processo morto quando não deveria existir.
As implicações disto são explicadas nos comentários do bugtracker, mas vou resumir aqui: além de initctl
não ser capaz de parar o processo daemon e ficar preso em um estado ilegal / não documentado <service> start/killed, process <pid>
, se o processo pertencer para que o PID pare (e geralmente será) então o PID é liberado para reutilização pelo sistema.
Se você emitir initctl stop <service>
ou service <service> stop
, initctl
eliminará esse PID na próxima vez que aparecer. Isso significa que, em algum ponto da estrada, se você não reiniciar depois de cometer esse erro, o próximo processo para usar esse PID será imediatamente eliminado por initctl
, mesmo que não seja o daemon. Pode ser algo tão simples como cat
ou tão complexo quanto ffmpeg
, e você teria dificuldade em descobrir por que seu pacote de software falhou no meio de alguma operação de rotina.
Portanto, o problema é que você especificou a opção expect
errada para o número de forquilhas que o processo daemon realmente faz. Eles dizem que há uma reescrita que resolve esse problema, mas a partir da versão 1.8 (mais recente Ubuntu 13.04 / janeiro de 2014), o problema ainda está presente.
Como você usou expect daemon
e acabou com esse problema, recomendo que você tente expect fork
.
Edit: Aqui está um script compatível com Ubuntu BASH ( original de Wade Fitzpatrick modificado para use o Ubuntu sleep
) que gera processos até que o espaço de endereço de ID do processo disponível esteja esgotado, ponto no qual ele inicia em 0 e trabalha até o PID "preso". Em seguida, é gerado um processo no PID initctl
, e initctl
o mata e redefine.
#!/bin/bash
# usage: sh /tmp/upstart_fix.sh <pid>
sleep 0.001 &
firstPID=$!
#first lets exhaust the space
while (( $! >= $firstPID ))
do
sleep 0.001 &
done
# [ will use testPID itself, we want to use the next pid
declare -i testPID
testPID=$(( - 1))
while (( $! < $testPID ))
do
sleep 0.001 &
done
# fork a background process then die so init reaps its pid
sleep 3 &
echo "Init will reap PID=$!"
kill -9 $$
# EOF