Dlaczego PGID mojego dziecka nie przetwarza PID rodzica?

13

Dlatego wciąż czytam wszędzie, że to polecenie powinno zakończyć wszystkie procesy potomne procesu nadrzędnego:

kill -- -$$

Użycie ujemnego identyfikatora z poleceniem kill odnosi się do PGID, a z przykładów, które widziałem, wydaje się, że PGID procesów potomnych powinien być PID rodzica, ale w moim systemie tak nie jest.

W moim systemie PGID dziecka jest taki sam jak PGID skryptu nadrzędnego, który okazuje się bash.

Co tu się dzieje? Czy przykłady były błędne lub czy mój system jest skonfigurowany inaczej?

To, co muszę osiągnąć, to zakończyć procesy potomne bez zakończenia rodzica, więc nie chcę wysyłać sygnału zabicia do PGID, w którym znajduje się rodzic.

TCZ8
źródło

Odpowiedzi:

11

Myślę, że masz na myśli PGID, który oznacza ID grupy procesów .

Po rozwidleniu proces dziedziczy swój PGID od swojego rodzica. PGID zmienia się, gdy proces staje się liderem grupy procesów , a następnie jego PGID jest kopiowany z jego PID. Od tego momentu nowe procesy potomne, które się odradzają, a ich potomkowie dziedziczą ten PGID (chyba że uruchomią własne własne grupy procesów).

W powłoce z kontrolą zadań, takiej jak większość interaktywnych powłok, każde zadanie jest umieszczane we własnej grupie procesów. Jeśli uruchomisz skrypt powłoki, proces powłoki uruchamiający skrypt będzie liderem grupy, a PGID będzie równy PID.

W powłoce bez kontroli zadań, takiej jak większość powłok używanych do uruchamiania skryptów, polecenia są uruchamiane w grupie procesów powłoki.

Składnia kill -- -Nzabija wszystkie procesy w grupie z PGID = N. Nie można jej używać z dowolnym PID, tylko PID lidera grupy procesów, ponieważ taki jest PGID. Zasadniczo tak wygląda powłoka

kill %jobid

działa składnia - przekłada się wewnętrznie %jobidna PGID zadania i wysyła sygnał do tego PGID.

Nie ma prostego sposobu na uruchomienie skryptu we własnej grupie procesów z innego skryptu powłoki. Zobacz jednak Jak ustawić grupę procesów skryptu powłoki, aby uzyskać kilka sugestii.

Barmar
źródło
Czy mówisz, że powłoka z kontrolą zadań lub bez niej robi to samo?
TCZ8
1
Nie. Powłoka z kontrolą zadań uruchamia nową grupę procesów dla każdego zadania. Powłoka bez kontroli zadań nie uruchamia nowej grupy procesów dla każdego zadania, uruchamia je we własnej grupie procesów.
Barmar
wow .. Nie przeczytałem tego za pierwszym razem. Więc chyba chcę włączyć kontrolę pracy? Czy to zapewni, że dzieci mają PGID zgodny z PID skryptu nadrzędnego? Czy każde dziecko otrzyma swój własny, niepowtarzalny PGID?
TCZ8
Znalazłem kilka dokumentów online na temat kontroli pracy, nie będę przez to przechodził. Dzięki za pomoc, Barmar.
TCZ8
1
Dzięki kontroli zadań każde dziecko otrzymuje własny PGID. Bez kontroli zadań dziedziczą PGID nadrzędnego. Ale rodzic może odziedziczyć swój PGID od swojego rodzica, jeśli nie jest liderem grupy procesów.
Barmar