Como eu forço a saída para um arquivo quando não há nenhum TTY alocado?

1

Eu tenho um script de inicialização que faz algo assim na função start ():

runuser -s /bin/bash - prog -c "nohup php /foo/bar.php 2>&1 >> /var/log/bar.log &"

Quando faço SSH na máquina e chamo o script de inicialização:

server:~$ sudo /etc/init.d/foo restart

está tudo bem - toda a saída vai para bar.log como esperado e eu posso sair.

No entanto, se eu chamar o script de inicialização diretamente do meu comando SSH:

workstation:~$ ssh server sudo /etc/init.d/foo restart

então a saída chega ao meu terminal local, não ao log, e não consigo fechar a conexão SSH sem perder toda a saída (que não está mais indo para o arquivo de log). Certamente há uma maneira melhor de formular o script de inicialização e qualquer sugestão seria apreciada, mas o que está acontecendo com o redirecionamento neste exemplo?

    
por Drew Stephens 30.11.2009 / 21:28

2 respostas

3

tente isto:

runuser -s /bin/bash - prog -c "nohup php /foo/bar.php >> /var/log/bar.log 2>&1 &"

importa quando você faz o redirecionamento.

Em seu exemplo, você redireciona stderr para stdout e depois stdout para /var/log/bar.log. Mas isso não significa que o stderr também seja redirecionado para /var/log/bar.log

O shell interpreta seus comandos da esquerda para a direita, portanto, se você quiser redirecionar ambos os fluxos para o arquivo, primeiro você precisa redirecionar o stdout para /var/log/bar.log e depois redirecionar o stderr para o loaction do stdout, que é /var/log/bar.log.

Difícil de explicar em uma língua estrangeira. Desculpe:)

    
por 30.11.2009 / 22:33
0

Eu continuo hackeando essa resposta ...

Usando o SSH para iniciar remotamente um processo responde parcialmente a esse conjunto de perguntas.

Como o ssh conecta stdin / stdout / stderr ao terminal local, seu redirecionamento realmente não funciona quando iniciado através da linha de invocação ssh.

E como o tty de controle é de propriedade do ssh se ele desaparecer, o mesmo acontece com o tty e qualquer programa iniciado por meio da linha de invocação ssh. Neste caso, /etc/init.d/foo provavelmente não é iniciado através do daemon /etc/init.d/functions (), nem o programa atual chama a função daemon () C, que em ambos os casos destaca programa do controle tty permitindo que o ssh saia de maneira limpa sem matar o programa alvo. E no processo permite que o redirecionamento assuma.

Não é uma boa explicação, eu sei. Espero que alguém possa levar o acima e formular uma resposta definitiva com ele.

    
por 30.11.2009 / 22:37