Jak mogę zabić tylko proces nadrzędny? Chcę, aby procesy dzieci nie zostały zabite. Jeśli spróbuję zabić proces rodzica, dzieci dostaną SIGHUP i zostaną zabite.
Czy definicja procesu potomnego jest powiązana z jego rodzicem?
Brad Patton,
hm, prawdopodobnie tak. Jest związany z rodzicem.
kcm1700,
Odpowiedzi:
8
Ogólnie rzecz biorąc, kiedy proces staje się osierocony (tzn. Umiera jego rodzic), jest on przyjmowany przez init.
Opisana szczególna sytuacja prawdopodobnie dotyczy procesu interaktywnego, gdy jego kontrolujący terminal zostanie zamknięty (z Wikipedii ):
Sygnał SIGHUP jest wysyłany do procesu, gdy jego terminal sterujący jest zamknięty. Pierwotnie został zaprojektowany, aby powiadomić proces upuszczenia linii szeregowej. W nowoczesnych systemach sygnał ten zwykle oznacza, że sterowanie pseudo lub wirtualnym terminalem zostało zamknięte.
Aby temu zapobiec, procesy potomne powinny blokować SIGHUP, więc w większości przypadków potrzebujesz współpracy z procesem nadrzędnym.
Jeśli proces nadrzędny jest powłoką ( bash, cshi tym podobne) i chcesz poleceń uruchamianych nie do wypowiedzenia, gdy kończy bash, można poprzedzić dowolne polecenie z nohup(od info coreutils "nohup invocation"):
„nohup” uruchamia podaną POLECENIE z ignorowanymi sygnałami rozłączenia, dzięki czemu komenda może kontynuować działanie w tle po wylogowaniu.
Odpowiedzi:
Ogólnie rzecz biorąc, kiedy proces staje się osierocony (tzn. Umiera jego rodzic), jest on przyjmowany przez init.
Opisana szczególna sytuacja prawdopodobnie dotyczy procesu interaktywnego, gdy jego kontrolujący terminal zostanie zamknięty (z Wikipedii ):
Aby temu zapobiec, procesy potomne powinny blokować SIGHUP, więc w większości przypadków potrzebujesz współpracy z procesem nadrzędnym.
Jeśli proces nadrzędny jest powłoką (
bash
,csh
i tym podobne) i chcesz poleceń uruchamianych nie do wypowiedzenia, gdy kończy bash, można poprzedzić dowolne polecenie znohup
(odinfo coreutils "nohup invocation"
):W tym przykładzie:
find
nie zostanie zabity, gdy powłoka zakończy działanie i zamknie terminal kontrolny/dev/ttys000
.Jeśli skrypt powłoki powinien blokować SIGHUP, użyj wbudowanego
trap
, jak wyjaśniono tutaj dlabash
.źródło