Executando um script onde você acrescenta os erros ao arquivo e usa nohup

1

O script funciona!

Primeiro eu digito isso na minha CLI: php worker.php >>/home/xxx/log 2>&1 Então, quero que ele seja executado como seu próprio processo ou qualquer outra coisa, então adiciono um & no final, como este: php worker.php >>/home/xxx/log 2>&1 &

Mas agora o script nunca é executado, porque nada é anexado a /home/xxx/log e quando eu verifico ps -fux o script ainda está lá.

Uma coisa que eu não entendo é que quando eu executo o último comando eu recebo isso:

xxx@xxx:/path$ php worker.php >>/home/xxx/log 2>&1 &
[1] 10659

Mais tarde, quando tento sair do shell, isso me diz:

xxx@xxx:/path$ logout
There are stopped jobs.

[1]+  Stopped                 php worker.php >> /home/xxx/log 2>&1

O que está acontecendo aqui? Tudo que eu quero é executar um script em segundo plano e anexar toda a saída a um arquivo.

Obrigado!

EDITAR:

Aqui está um exemplo.

user@box:~/nohuptest$ vim worker.php
user@box:~/nohuptest$ touch log
user@box:~/nohuptest$ php worker.php >> log 2>&1 &
[1] 31523
user@box:~/nohuptest$ cat log

[1]+  Stopped                 php worker.php >> log 2>&1
user@box:~/nohuptest$ php worker.php >> log 2>&1 &
[2] 31626
user@box:~/nohuptest$ cat log

[2]+  Stopped                 php worker.php >> log 2>&1
user@box:~/nohuptest$
user@box:~/nohuptest$ cat worker.php
<?php
echo "hello world\n";
?>
user@box:~/nohuptest$
    
por Johannes 20.08.2013 / 16:45

3 respostas

0

Eu encontrei a solução.

php script.php [args] </dev/null >>/path/to/log 2>&1 &

O PHP estava esperando por uma entrada ... Eu não tenho idéia se posso consertar isso no arquivo php.ini, mas por enquanto isso funciona ...

    
por 23.08.2013 / 11:51
1

Eu acho que deve haver um erro de digitação ou algo em algum lugar. O que você está descrevendo deve funcionar perfeitamente:

$ cat worker.php
<?
echo "hello world\n"
?>
$ php worker.php >> log 2>&1 &
[1] 16353
$ cat log
hello world
$ php worker.php >> log 2>&1 &
$ cat log
hello world
hello world

Você poderia tentar com este exemplo e nos informar se funciona?

O [1] 16353 é apenas bash informando que lançou o trabalho em segundo plano com um ID do processo de 16353.

    
por 20.08.2013 / 17:04
1

Meu palpite é que seu programa abre o tty. Pode não ser você quem faz isso, mas o próprio PHP.

Tente:

php worker.php </dev/null >>/home/xxx/log 2>&1 &

Se isso não funcionar, você pode sempre executá-lo no tmux / screen:

tmux [enter]
php worker.php </dev/null >>/home/xxx/log 2>&1
[CTRL-b][d]

Você provavelmente também pode executá-lo usando script:

echo "php worker.php >>/home/xxx/log 2>&1" | script &
    
por 21.08.2013 / 05:52