Jak zabić zarówno proces, jak i podproces?

9

Zadałem pytanie, aby dowiedzieć się, jak uzyskać wiele wierszy wiadomości z modułu podprocesu Pythona.

Problem polega na tym, że w trakcie testów musiałem zabić proces Pythona, który uruchamia proces gnuchess. Używanie ^ c w wierszu poleceń wydaje się zabijać proces Pythona, ale nie gnuprocess.

Za zabicie gnuchess dostaję pid za pomocą ps aux | grep gnuchess i uruchom kill -9 PID . Czy istnieją inne metody zabijania zarówno Pythona, jak i gnuchess?

prosseek
źródło
8
Losowy sidenote: Możesz użyć, pkillaby zabić proces po imieniu, więc możesz ps aux | grep gnuchessi kill -9 PIDpo prostu zostaćpkill -9 gnuchess
Michael Mrozek

Odpowiedzi:

10

Istnieje standardowa metoda, jeśli programy współpracują. Uruchom kill -- -42tam, gdzie 42 jest pid procesu nadrzędnego. To wysyła sygnał do wszystkich procesów w grupie procesów prowadzonych przez proces 42 (znak minus przed pid oznacza grupę procesów).

Zwykle, jeśli uruchomisz skrypt Pythona z wiersza poleceń powłoki i po prostu rozwidli się gnuchess, dwa procesy powinny pozostać w tej samej grupie procesów. Ale wydaje się, że tak nie jest, ponieważ Ctrl+ Cwysyła SIGINTdo całej grupy procesów pierwszego planu.

Gnuchess może należeć do swojej własnej grupy procesów, ponieważ stał się liderem sesji (ale nie wiem, dlaczego miałby to robić) lub ponieważ rozwidliłeś go dwukrotnie (python rozwidla powłokę, która wywołuje gnuchess). Prawdopodobnie można uniknąć podwójnego rozwidlenia, ale nie mogę ci powiedzieć, jak to zrobić bez obejrzenia twojego kodu.


Racjonalnie niezawodny i zgodny z POSIX sposób na znalezienie pid gnuchessprocesu to

gnuchess_pids=$(ps -A -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}')

Określone warianty uniksowe mogą mieć lepsze sposoby osiągnięcia tego celu, takie jak pgrep.

Gilles „SO- przestań być zły”
źródło
0

Próbować:

pkill <processname>
Kłopot
źródło