Я запускаю простой скрипт PHP на CentOS 6.5 с php5.3.3
#!/usr/bin/env php
<?php
echo "hello"."\n";
return 0;
?>
Моя проблема в том, что если я сделаю ./testscript
работает нормально, если я nohup ./testscript &
работает нормально, если я ./testscript < /dev/null > /dev/null &
он работает нормально (то же самое без перенаправления вывода).
Но если я сделаю ./testscript &
, скрипт остановлен (и нет вывода):
[1]+ Stopped ./testscript
Из того, что я понимаю, это потому, что php ожидает ввода от STDIN. Но вопрос почему? Как вы можете видеть, в этом простом скрипте нет ничего требующего ввода, и у меня не было такого поведения на моем php5.4 в Debian. Это изменение в поведении происходит от версии php или ОС?
И почему так? Есть ли способ изменить это и позволить мне запускать скрипт в фоновом режиме, не добавляя / dev / null в качестве STDIN?
Спасибо !
Ваша программа ничего не делает, кроме печати чего-либо и завершения return 0
(конечно, вы не имеете в виду выход()?). После выполнения кода интерпретатору php больше нечего делать, и он просто сообщает оболочке: «Привет, приятель! Я готов! Ты можешь уведомить пользователя!» Называя это с &
просто говорит оболочке: «Запустите эту команду в фоновом режиме». Который это делает. Ровно один раз.
Чтобы ваша программа работала бесконечно, она имеет на самом деле бежать бесконечно тоже.
<?php
while(true) {
// Doing something useful
sleep(5);
}
?>
В случае nohup «программа» (в данном случае интерпретатор php) в принципе запрещается прекратить — но это больше не даст. Что касается перенаправлений — они на самом деле будут нацелены на интерпретатор php, который будет ожидать дальнейшего ввода, который не приходит, потому что / dev / null ничего не излучает.
Других решений пока нет …