2011-12-05 12 views
8

Witryna WWW musi być w stanie uruchomić i zatrzymać proces demona. To, co aktualnie robię, to Uruchamianie demona z PHP

exec("sudo /etc/init.d/daemonToStart start"); 
Proces demona jest uruchomiony, ale Apache/PHP się zawiesza. Wykonanie ps aux ujawniło, że samo sudo zmieniło się w proces zombie, skutecznie zabijając wszystkie dalsze postępy. Czy to normalne zachowanie podczas próby uruchomienia daeomon z PHP?

I tak, Apache ma prawo wykonać polecenie /etc/init.d/daemonToStart. Zmieniłem plik/etc/sudoers, aby to umożliwić. Nie, nie pozwoliłem, aby Apache mógł wykonać dowolne polecenie, a tylko kilka z nich, aby umożliwić działanie strony.

W każdym razie, wracając do mojego pytania, czy istnieje sposób na umożliwienie PHP uruchamiania demonów w taki sposób, aby nie powstawał proces zombie? Pytam o to, ponieważ gdy wykonuję odwrotność, zatrzymanie już uruchomionego daemona, działa dobrze.

+0

nie powinien istnieć 'start' argumentem? – ZeissS

+0

To prawda, zapomniałem dodać tego do pytania. W moim kodzie mam to. Ale edytuję pytanie pod kątem kompletności. – ThaMe90

Odpowiedz

10

Spróbuj dołączyć > /dev/null 2>&1 & do polecenia.

Więc tak:

exec("sudo /etc/init.d/daemonToStart > /dev/null 2>&1 &"); 

Tylko w przypadku, gdy chcesz wiedzieć, co robi/dlaczego:

  • > /dev/null - przekierowanie STDOUT do/dev/null (Blackhole to, innymi słowy)
  • 2>&1 - przekierować STDERR do STDOUT (Blackhole go również)
  • & proces odłączyć i działać w tle
+0

Dzięki, to się udało! – ThaMe90

+0

Dzięki za dalsze wyjaśnienie, ale ponieważ wyjście jest zaciemnione, każdy kod, który powinien zostać wykonany po uruchomieniu demona, jest również włączony. Muszę sprawdzić, czy proces się rozpoczął, ale ten kod nigdy się nie uruchamia ... – ThaMe90

+1

Po uruchomieniu procesu używającego tej metody, powinien wyprowadzić PID procesu, który został utworzony. Możesz wziąć to, a następnie (na przykład) wykonać 'ps | grep $ pidOfProcessYouJustStarted', aby upewnić się, że działa. – DaveRandom

0

nigdy nie próbowałem uruchamiania demona z PHP, ale mam próbowali uruchamiania innych poleceń powłoki, z wielkim problemem. Oto kilka rzeczy, próbowałem w przeszłości:

  • Zgodnie odpowiedź DaveRandom za dołącz /dev/null 2>&1 & na końcu polecenia. Spowoduje to przekierowanie błędów na standardowe wyjście. Możesz użyć tego wyjścia do debugowania.
  • Upewnij się, że PATH użytkownika serwera WWW zawiera wszystkie pliki binarne, do których istnieją odnośniki w skrypcie demona. Możesz to zrobić, dzwoniąc pod numer exec('echo $PATH; whoami;). Dzięki temu dowiesz się, jaki jest PHP użytkownika i jest to bieżąca zmienna PATH.
2

Miałem ten sam problem.

Zgadzam się z DaveRandom, należy tłumić każde wyjście (stdout i stderr). Ale nie trzeba uruchamiać w innym procesie z zakończeniem "&": funkcja exec() nie może już sprawdzić kodu powrotu, i zwraca ok, nawet jeśli wystąpił błąd ...

I wolę przechowywać wyniki w pliku tymczasowym, zamiast "blackhole'it". roztwór roboczy:

$temp = tempnam(sys_get_temp_dir(), 'php'); 
exec('sudo /etc/init.d/daemonToStart >'.$temp.' 2>&1'); 

Tuż po odczytać zawartość pliku i usuń plik tymczasowy:

$output = explode("\n", file_get_contents($temp)); 
@unlink($temp);