
O roteiro funciona!
Primeiro eu digito isso na minha CLI: php worker.php >>/home/xxx/log 2>&1
Depois, quero que ele seja executado como seu próprio processo ou algo assim, então adiciono um &
no final, assim:php worker.php >>/home/xxx/log 2>&1 &
Mas agora o script nunca é executado, porque nada é anexado /home/xxx/log
e quando verifico ps -fux
o script ainda está lá.
Uma coisa que não entendo é que quando executo o último comando recebo isto:
xxx@xxx:/path$ php worker.php >>/home/xxx/log 2>&1 &
[1] 10659
Mais tarde, quando tento sair do shell, ele me diz o seguinte:
xxx@xxx:/path$ logout
There are stopped jobs.
[1]+ Stopped php worker.php >> /home/xxx/log 2>&1
O que está acontecendo aqui? Tudo o que 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$
Responder1
Acho que deve haver um erro de digitação ou algo assim 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
está apenas bash
dizendo que lançou o trabalho em segundo plano com umID do processode 16353.
Responder2
Meu palpite é que seu programa abre o tty. Pode não ser você quem faz isso, mas o próprio PHP.
Tentar:
php worker.php </dev/null >>/home/xxx/log 2>&1 &
Se isso não funcionar, você pode executá-lo em 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 o script:
echo "php worker.php >>/home/xxx/log 2>&1" | script &
Responder3
Eu encontrei a solução.
php script.php [args] </dev/null >>/path/to/log 2>&1 &
O PHP estava esperando por uma entrada... Não tenho ideia se posso consertar isso no arquivo php.ini, mas por enquanto funciona...