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 ...
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$
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.
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 &
Tags command-line process linux unix