Reiniciar o Apache trava a sessão SSH

1

Eu tenho um script que fará muito trabalho de preparação (gere arquivos de configuração, minimize e gzip arquivos Javascript e CSS, etc) e então reinicie o apache que está instalado em um local não padrão. Mas depois que o script é executado, quando tento exit da minha sessão ssh, ele fica pendurado indefinidamente.

Eu li a recomendação que eu deveria redirecionar o IO para a chamada real para o binário httpd com algo parecido com isto:

sudo /path/to/httpd -f /path/to/config < /dev/null >& /dev/null

E isso funciona e minha sessão ssh não trava mais depois que o script é concluído. Mas o problema é que agora eu perdi todos os erros que são cuspidos para STDERR se algo der errado quando é iniciado. Isso parece muito estranho para mim porque eu tenho outro sistema com uma configuração semelhante (mas não exata) que não trava. E a partir da leitura da recomendação que sugere essa solução alternativa, diz que os daemons (como o apache) já devem estar cuidando disso. Então, o que estou perdendo? Quaisquer sugestões sobre como posso rastreá-lo ou como posso corrigi-lo?

    
por mpeters 14.10.2010 / 23:03

1 resposta

3

Primeiramente, você parece ter o e comercial no lugar errado. Em vez de

/path/to/httpd -f /path/to/config < /dev/null >& /dev/null

Eu esperaria

/path/to/httpd -f /path/to/config < /dev/null > /dev/null &

EDIT - na verdade, command >& file é uma forma abreviada de command > file 2>&1 . Eu nunca usei a forma curta, então eu entendi mal a intenção dessa construção.

Mas eu não faria isso. Redirecionar STDIN e STDOUt para / dev / null está errado. Omitir STDERR também está errado. Fazer isso para programar o que se coloca no modo daemon está errado. Se você realmente tivesse que fazer isso, eu faria algo como

nohup /path/to/httpd -f /path/to/config >/tmp/httpd.out 2>/tmp/httpd.err &

Mas aguarde, o Apache pode ser reiniciado enviando sinais usando o script apachectl . Você pode sinalizar ao Apache para recarregar sua configuração sem deixar as conexões existentes ou você pode sinalizá-lo para reiniciar novamente. Se tudo o que você está fazendo é mudar sua configuração, basta fazer um relançamento gracioso. Eu também usaria apachectl para fazer um configtest .

Se o Apache estiver em um local fora do padrão, você ainda poderá usar o apachectl.

Se você não pode usar o apachectl, pode enviar sinais SIGUSR1 (recarregar) ou SIGHUP (reiniciar) para o processo principal do httpd.

Se o apache não estiver sendo executado, a melhor maneira de iniciá-lo é usando o script /etc/init.d/apache start

Se o apachectl e os scripts de inicialização não funcionarem porque você mudou os programas, eu os editaria, há variáveis que dizem em quais diretórios os executáveis estão.

    
por 15.10.2010 / 00:09