Почему мой процесс останавливается при запуске в фоновом режиме?

0

Я запускаю простой 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?

Спасибо !

Теги:
stdin
centos6.5

1 ответ

0

Ваша программа ничего не делает, кроме как печатать что-то и заканчивается return 0 (конечно, вы не имеете в виду exit()?). После того, как код выполнен, интерпретатору php больше нечего делать и просто сигнализирует о оболочке "Привет, парень! Я закончил! Вы можете уведомить пользователя!" Вызов с помощью & просто говорит оболочке: "Запустите эту команду в фоновом режиме". Что он делает. Точно один раз.

Чтобы ваша программа работала неограниченно долго, она также должна работать бесконечно.

<?php
  while(true) {
    // Doing something useful
    sleep(5);
  }
?>

С nohup "программа" (интерпретатор php, в данном случае) в основном запрещается прекращать - но это будет не так много. Что касается перенаправления - они будут на самом деле нацелены на интерпретатор php, который будет ожидать ввода дополнительных данных, что не произойдет, потому что /dev/null ничего не испускает.

  • 1
    Он не указывает, что хочет, чтобы его сценарий работал вечно. nohup не предотвращает (или запрещает) выход из программы, он предотвращает ее уничтожение из-за сигнала зависания. Его вопрос в том, почему php ждет ввода. Он не просил это сделать это.
  • 0
    На самом деле, что еще должно быть причиной перенаправления ввода / вывода? Может быть, я просто не понимаю вопрос.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню