Mam następujące procesy.
ParentProcess - ChildProcess - ChildProcess - ChildProcess
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.
Mam następujące procesy.
ParentProcess - ChildProcess - ChildProcess - ChildProcess
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.
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 ):
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
, csh
i 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.
W tym przykładzie:
$ tty
/dev/ttys000
$ nohup find /dir -name file -exec rm {} \;
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 dla bash
.