Por que preciso pressionar enter para obter meu prompt do shell depois que meu script init.d for concluído?

6

Eu tive que escrever meu próprio script init.d do CentOS para o aipo porque ele só vem com um para o Debian . Você pode ver o script que escrevi quando respondi à minha própria pergunta de estouro de pilha 3989656 .

Mas há um problema com esse script. se eu invoco isto:

sudo service celeryd start

então eu preciso apertar enter para obter um prompt de shell depois que ele for concluído. Isso é um problema porque eu quero invocá-lo via ssh de outra máquina fazendo:

ssh 192.168.2.3 sudo service celeryd start

e ssh nunca retornam. (Eu uso fabric para iniciar e parar serviços remotos, e isso trava porque chama o comando ssh acima).

O que causaria esse comportamento e como corrigi-lo no meu script?

Note que se eu fizer "sh -x /etc/init.d/celeryd" como recomendado por Thomas Themel nos comentários, a saída é:

runuser -s /bin/bash - apache -c 'ulimit -S -c 0 >/dev/null 2>&1 ; /usr/local/django/portalapps/manage.py celeryd --pidfile /var/run/celery.pid -f /var/log/celeryd.log -l INFO'

Eu não entendo como a função daemon em /etc/init.d/functions (que é o que produz esta série de comandos bash) realmente daemoniza o processo.

    
por Lorin Hochstein 21.11.2010 / 02:40

4 respostas

1

Tive exatamente o mesmo problema: sua pergunta e suas investigações realmente me ajudaram a encontrar a resposta.

Inicie o aipo com celery_detach - e, poof! As coisas funcionam!

ie. manage.py celery_detach --params --settings=foo

Ele retorna imediatamente, com uma quebra de linha adequada e as coisas que o tecido está procurando.

    
por 01.05.2011 / 10:20
3

Você pode querer descobrir exatamente o que come que retorna, executando primeiro o script /etc/init.d diretamente com (sudo conforme necessário) sh -x /etc/init.d/celeryd start . Se estiver no shell script, você deverá ver desta forma. Se daemon estiver aguardando uma nova linha antes de retornar, sua resposta será específica e poderá se beneficiar da execução de strace ou simplesmente com um < /dev/null anexado, para que não tenha acesso à entrada padrão por meio do seu terminal.

Outra coisa "apalpe no escuro": execute ssh com a opção -nt para desabilitar a alocação de terminal e a entrada padrão.

    
por 21.11.2010 / 12:39
3

Você pode realmente ter um prompt de shell e não perceber. Se você tem um programa que grava no terminal enquanto está em segundo plano, seu prompt fica encoberto, mas ainda está pronto para entrada.

test.sh:

#! /bin/sh
echo -e "This is a test\n\n"

shell interativo:

$sh test.sh &
$This is a test



_

Neste exemplo, o prompt está lá. Você vê o "$" logo antes de "Este é um teste" que é o prompt. Na parte inferior, você pode ver o cursor esperando pela entrada. Se você digitar um comando aqui e pressionar enter, ele funcionará normalmente. Tente executar ls após iniciar seu daemon, mas antes de pressionar <enter> .

    
por 21.11.2010 / 13:19
0

O comando daemon precisa de & no final. Eu não acho que isso aconteça. Esta pode ser a fonte do seu problema.

    
por 21.11.2010 / 23:52