Usando nohup para manter um script executando indefinidamente

6

Sou muito novo em Linux e só o usei em SSH no meu servidor da web usando Putty . A questão que estou tendo é esta:

Basicamente eu tenho 2% de scriptsphp. Um get_tweets.php constantemente ouve tweets sobre twitters Streaming API enquanto o outro - parse_tweets.php registra estes em db . Para que isso funcione, eles devem continuar funcionando continuamente.

Eu tenho usado os seguintes comandos para executá-los em segundo plano e pelo que vi eles rodarem a maior parte do dia, no entanto, sempre que eu faço logon no meu computador pela manhã, o scripts parou e Eu tenho que executar comandos novamente.

nohup php my_script.php > /dev/null &

Só estou querendo saber se isso é normal com base nos comandos que estou usando, eles devem ser executados indefinidamente quando usar nohup e, se não, qual é a alternativa? Um trabalho CRON ?

Obrigado pela ajuda

    
por Javacadabra 10.09.2014 / 10:00

3 respostas

8

Com nohup , você também deve redirecionar os erros. O próximo comando executa o script com saída e os erros que redirecionam para / dev / null:

nohup php my_script.php >/dev/null 2>&1 &

Mas o seu script pode ser encerrado por outros motivos (erro no script, oom-killer, etc). Portanto, você deve desmontá-lo pelo init do sistema (se ele suportar reinicialização automática - upstart, systemd e alguns outros podem fazer isso). Ou você deve escrever a tarefa cron para checar e reiniciar seu script se não for executado.

    
por 10.09.2014 / 11:34
4

Talvez você queira ver o que está acontecendo e não redirecionar a saída para /dev/null .

Sugiro que você abra uma sessão screen ou tmux . Ambos são multiplexadores de terminal , que permanecerão ativos mesmo que você efetue logout.

Por exemplo (..) para informações

$ screen
$(inside screen-t1): ./get_tweets.php
.... running first

Agora, pressione Ctrl-a c para abrir um novo terminal.

 $(inside screen-t2): ./parse_tweets.php
 ... running second

Ctrl-a d permite desanexar a sessão. Quando você fizer logon novamente, use screen -r

Nota: Você pode mostrar uma barra de status na tela para visualizar as diferentes janelas.

    
por 10.09.2014 / 10:05
0

Se você quiser apenas garantir que o script seja reiniciado quando ele morrer, você poderá fazer algo como while true ; do php my_script.php ; done > /dev/null

Isto irá esperar que my_script.php termine de ser executado e, em seguida, execute-o novamente. Toda a saída será enviada para / dev / null

Se você quiser usar o nohup, faça o seguinte

$ echo 'while true ; do php my_script.php ; done > /dev/null' > ~/php_run_loop.sh
$ chmod a+x ~/php_run_loop.sh
$ nohup ~/php_run_loop.sh

NOTA: Se você tiver um erro ou outro problema no seu script php, isso fará com que ele seja executado repetidas vezes sem limite. Esta não é uma solução elegante, mas é uma solução.

BTW, o cron é bom para executar um processo de curta duração em um cronograma (a cada 5 minutos ou a cada semana, etc.), ele não sabe como manter um processo existente em execução.

    
por 10.09.2014 / 18:57