Upstart não iniciando emacs --daemon

2

Estou tentando iniciar o daemon do emacs por meio do upstart. Aqui está o meu script

# emacs --daemon - Emacs daemon
#
# The Emacs daemon provides a server for Emacs clients.

description     "Emacs daemon"

start on runlevel[2345]
stop on runlevel[!2345]

respawn
respawn limit 10 5 # respawn up to 10 times, waiting 5 seconds each time

pre-start script
        echo "Starting emacs daemon..." > /home/eric/Desktop/emacs.log
end script

pre-stop script
        emacsclient -n -e '(save-persistent-scratch)'
end script

exec emacs --daemon

Eu posso começar isso com sudo initctl start emacs . No entanto, isso não é executado durante a inicialização (ou emacs --daemon morre?). Chamar sudo initctl list exibe o trabalho como emacs stop/waiting , o que aparentemente significa que o trabalho ainda não foi iniciado. No entanto, chamar runlevel retorna N 2 .

Como corrijo isso?

Edit: v2 do arquivo conf (adicionado espera fork e correu o emacs sob minha conta) Edit: v3 (corrigido para esperar daemon)

# emacs --daemon - Emacs daemon
# 
# The Emacs daemon provides a server for Emacs clients.

description     "Emacs daemon"

start on runlevel[2345]
stop on runlevel[!2345]

expect daemon
respawn
respawn limit 10 5 # respawn up to 10 times, waiting 5 seconds each time

pre-start script
        echo "Starting emacs daemon..." > /home/eric/Desktop/emacs.log
end script

pre-stop script
    emacsclient -n -e '(save-persistent-scratch)'
end script

exec start-stop-daemon --start --chuid eric --exec /usr/bin/emacs -- --daemon -u eric

Editar:

Depois de pesquisar, descobri que o upstart fornece uma ferramenta chamada initctl check-config , que pode verificar as condições inacessíveis.

A execução da ferramenta revelou que meu arquivo conf estava sem um espaço em runlevel[2345] , como runlevel [2345] . O daemon agora é iniciado corretamente.

No entanto, quando executo sudo initctl stop emacs , ele é interrompido e o daemon do emacs não é eliminado. Eu acho no dmesg isso e só isso

[ 4378.169249] init: emacs goal changed from start to stop

Mas, se eu matar o emacs através de kill ou emacsclient -n -e '(kill-emacs)' , isso aparece no dmesg

[ 4378.169286] init: emacs state changed from spawned to stopping
[ 4378.169314] init: event_new: Pending stopping event
[ 4378.169325] init: Handling stopping event
[ 4378.169392] init: event_finished: Finished stopping event
[ 4378.169399] init: emacs state changed from stopping to killed
[ 4378.169431] init: emacs state changed from killed to post-stop
[ 4378.169450] init: emacs state changed from post-stop to waiting
[ 4378.169473] init: event_new: Pending stopped event
[ 4378.169484] init: job_change_state: Destroyed inactive instance emacs
[ 4378.169542] init: Handling stopped event
[ 4378.169594] init: event_finished: Finished stopped event

A questão agora é: por que o initctl stop emacs não funciona?

    
por ehuang 03.10.2013 / 20:13

1 resposta

0

Como o 'emacs - daemon' se destaca do primeiro plano, você precisa deixar que o upstart saiba esperar isso; caso contrário, quando o processo do emacs pai for encerrado, ele assumirá que o serviço foi encerrado, deixando o serviço em um estado parado, mesmo que o emacs ainda esteja em execução.

Para permitir que o upstart saiba qual processo ele precisa rastrear (e matar ao interromper o serviço), você desejará adicionar 'esperar fork' à definição do job.

    
por slangasek 04.10.2013 / 06:51