Usar o chdir dentro da cláusula script está totalmente errado, e isso significa que você não consegue entender uma idéia muito básica no início (sem ofensa significava). (Como uma nota lateral, a palavra-chave exec é apenas inútil, mas não causa nenhum dano).
Existe uma ideia muito central para entender como funciona o upstart. O Upstart tenta determinar qual processo dos processos gerados pela sub-rotina script é o daemon real desse serviço. Em seguida, ele usa esse processo para determinar se esse trabalho está em execução ou interrompido ou com falha ou o que for. Por esse motivo, é de suma importância garantir que o processo esteja correto.
O algoritmo para determinar o processo é muito simples, depende da estrofe expect . expect fork significa "pegue a segunda bifurcação na sub-rotina script ", expect daemon - mesmo, mas a terceira.
Agora, usar chdir dentro de script significa que ele chama o binário real /bin/chdir e isso conta como uma bifurcação separada. O que você precisa fazer é movê-lo para fora da sub-rotina script e então jogar com a sub-rotina expect até acertar. Você pode verificar se acertou comparando a saída de initctl status celery com ps . Os PIDs devem corresponder.