Я запускаю простой 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 &
it отлично работает (это то же самое без перенаправления вывода). Но если я это сделаю ./testscript &
, сценарий остановлен (и выхода нет):
[1]+ Stopped ./testscript
Из того, что я понимаю, это потому, что php ожидает ввода от STDIN. Но почему? Как вы можете видеть, в этом простом скрипте нет ничего, требующего ввода, и у меня не было такого поведения на моем php5.4 на Debian. Это изменение в поведении происходит из версии php или ОС? И почему так? Есть ли способ изменить это и позволить мне запускать сценарий в фоновом режиме без необходимости добавлять /dev/null в качестве STDIN?
Спасибо !
Ваша программа ничего не делает, кроме как печатать что-то и заканчивается return 0
(конечно, вы не имеете в виду exit()?). После того, как код выполнен, интерпретатору php больше нечего делать и просто сигнализирует о оболочке "Привет, парень! Я закончил! Вы можете уведомить пользователя!" Вызов с помощью &
просто говорит оболочке: "Запустите эту команду в фоновом режиме". Что он делает. Точно один раз.
Чтобы ваша программа работала неограниченно долго, она также должна работать бесконечно.
<?php
while(true) {
// Doing something useful
sleep(5);
}
?>
С nohup "программа" (интерпретатор php, в данном случае) в основном запрещается прекращать - но это будет не так много. Что касается перенаправления - они будут на самом деле нацелены на интерпретатор php, который будет ожидать ввода дополнительных данных, что не произойдет, потому что /dev/null ничего не испускает.
nohup
не предотвращает (или запрещает) выход из программы, он предотвращает ее уничтожение из-за сигнала зависания. Его вопрос в том, почему php ждет ввода. Он не просил это сделать это.