2011-01-19 12 views
6

Otwieram długotrwały proces z popen(). Do debugowania, chciałbym zakończyć proces, zanim się zakończy. Wywołanie funkcji pclose() blokuje tylko do ukończenia przez dziecko.Procesy zabijania otwarte za pomocą funkcji popen()?

Jak mogę zabić ten proces? Nie widzę żadnego łatwego sposobu na usunięcie pid z zasobu, który popen() zwraca, aby móc wysłać sygnał.

Przypuszczam, że mógłbym zrobić coś kludgey i próbować fudge PID do wyjścia używając jakiegoś wiersza polecenia hackery ...

+0

To nie jest prawdziwa odpowiedź, ponieważ dotyczy C, a nie PHP, ale zobacz ten link, aby uzyskać sugestię: http://www.monkey.org/openbsd/archive/misc/0112/msg00360.html –

Odpowiedz

7

Cóż, wylądował na rozwiązanie: I z powrotem przełączony do proc_open() zamiast popen(). Wtedy to tak proste, jak:

$s = proc_get_status($p); 
posix_kill($s['pid'], SIGKILL); 
proc_close($p); 
+0

Miałem ten sam problem z 'proc_open()', więc spróbowałem prostszego 'popen()', mając nadzieję, że to pomogłoby. Nie zdawałem sobie wówczas sprawy, że * oba * 'pclose()' i 'proc_close()' blokują dopóki dziecko się nie zakończy. Kiedy już to zrozumiesz, musisz zabić dziecko. A żeby zabić dziecko, potrzebujesz pid, a to nie jest łatwo dostępne z 'popen()'. 'proc_open()' robi wszystko 'popen()', a następnie niektóre. –

+0

proszę zaznaczyć własną odpowiedź, aby ludzie wiedzieli, że znalazłeś rozwiązanie. – mauris

+0

@thephpdeveloper SO daje mi błąd "Możesz przyjąć własną odpowiedź jutro", właśnie teraz. –

0

Wystarczy wysłać kill (lub przerwać) sygnału przy użyciu funkcji kill:

+0

Podstępna część robi dobrą robotę, zastanawiając się, który pid zabić :) Gdy masz już pewność, że masz odpowiedni pid, możesz zadzwonić do 'posix_kill()'. Przypuszczam, że z perspektywy czasu mógłbym pobrać listę pidów potomnych z ps, ponieważ łatwo jest znaleźć własny pid. –

0

można znaleźć PID i sprawdza, czy naprawdę jesteś jego rodzicem, wykonując:

// Find child processes according to current pid 
$res = trim(exec('ps -eo pid,ppid |grep "'.getmypid().'" |head -n2 |tail -n1')); 
if (preg_match('~^(\d+)\s+(\d+)$~', $res, $pid) !== 0 && (int) $pid[2] === getmypid()) 
{ 
    // I'm the parent PID, just send a KILL 
    posix_kill((int) $pid[1], 9); 
} 

To działa bardzo dobrze na serwerze PHP szybko CGI.

Powiązane problemy