Isso é quase certamente determinado por (o padrão) php.ini
ou configuração equivalente:
max_execution_time = 30
TLDR: se você está certo de que o PHP está realmente saindo primeiro, e algo está matando seu script, então você pode usar o daemon para envolver e monitorar o processo Python (no modo não-reinicializante, ou seja, sem --respawn
), ou adicione handers de sinal para o script Python.
Em geral, se você conseguir executar um shell como o ID do usuário do script, será possível strace
ou truss
do processo, por exemplo, no linux você pode fazer isso de forma razoavelmente eficaz:
$ sleep 60 &
[1] 10873
$ strace -e trace=signal,process -p $!
Process 10873 attached - interrupt to quit
+++ killed by SIGKILL +++
Process 10873 detached
O processo sleep
foi finalizado com kill -9
de outro terminal. kill -9
não seria comum, já que um processo não seria capaz de interceptar isso e sair corretamente.
Para monitorar com daemon
, use uma variação em:
daemon -i --errlog=/tmp/mypy.log -- /usr/bin/python [...]
Isso registrará qualquer terminação relacionada ao sinal. Adicione --dbglog
e --debug=2
se você quiser registrar todas as saídas, independentemente disso.
Como observado em outros lugares, se o processo já foi encerrado, ele desapareceu. Apenas o pai (ou init) teria conseguido obter seu código de saída e, a menos que estivesse registrado (possivelmente usando contabilidade ou auditoria de processo), o código de saída é perdido.
Internamente para manipulação de tempo limite em plataformas * nix, o PHP configura SIGALARM
ou SIGPROF
com o tempo limite especificado. Esse manipulador de sinal simplesmente chama a função zend_error()
interna. No entanto, ele também chama qualquer chamadas de retorno registradas e gerentes de erros , que podem ser úteis para você.
Se o manipulador de erro padrão entrar em ação, o código de saída do PHP será, acredito, 255, já que o tempo limite é E_ERROR
.
Observe também que a convenção de um código de saída como 128 + N, onde N é o número do sinal, é devido ao comportamento de certos shells (incluindo bash
) e muitas APIs. O código de saída do processo real após um sinal é dependente do sistema. É provavelmente apenas o número do sinal, este é geralmente o caso no Linux. O grupo wait()
de chamadas do sistema fornece melhores detalhes da saída do processo. O PHP segue a convenção shell, por ex. Se você estiver usando popen()
e pclose()
, você verá 128 + N como o código de saída quando um sinal terminar o processo.
Outra consideração aqui é o comportamento dos limites de tempo do PHP, se você marcar o % co_de Documentação% que você verá
The set_time_limit() function and the configuration directive
max_execution_time
only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls usingsystem()
, stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.
Você pode provar isso com um script curto:
<?php
# for (;;);
$exe="sleep 20";
print "exit code: " . pclose(popen($exe, 'r'));
?>
Invoque com set_time_limit()
.
O script será executado por 20 segundos, não haverá erro. Se você matar o processo de sono, por exemplo time php -d max_execution_time=5 -f sleep3.php
em outro terminal, você verá um código de saída de 138 (128 + SIGUSR1).
Se você descomentar o loop kill -USR1 $(pgrep sleep)
infinito, o script terminará após 5 segundos.