GNU/Linux >> Linux Esercitazione >  >> Linux

Processo discendenti?

Sto cercando di creare un contenitore di processi. Il contenitore attiverà altri programmi. Ad esempio, uno script bash che avvia l'esecuzione di attività in background con l'utilizzo di "&".

La caratteristica importante che sto cercando è questa:quando uccido il contenitore, tutto ciò che è stato generato sotto di esso dovrebbe essere ucciso. Non solo figli diretti, ma anche i loro discendenti.

Quando ho iniziato questo progetto, credevo erroneamente che quando hai ucciso un processo anche i suoi figli venivano automaticamente uccisi. Ho chiesto consiglio a persone che avevano la stessa idea sbagliata. Sebbene sia possibile catturare un segnale e trasmettere l'uccisione ai bambini, non è quello che sto cercando qui.

Credo che ciò che voglio sia realizzabile, perché quando chiudi un xterm, tutto ciò che era in esecuzione al suo interno viene ucciso a meno che non sia stato eliminato. Ciò include i processi orfani. È quello che sto cercando di ricreare.

Ho un'idea che quello che sto cercando riguardi sessioni unix.

Se esistesse un modo affidabile per identificare tutti i discendenti di un processo, sarebbe utile poter inviare anche loro segnali arbitrari. per esempio. SIGUSR1.

Risposta accettata:

Se invii un segnale a un processo, quel processo viene ucciso. Mi chiedo come sia nata la voce secondo cui uccidere un processo uccide anche altri processi, sembra particolarmente controintuitivo.

Ci sono, tuttavia, modi per uccidere più di un processo. Ma non invierai un segnale a un processo. È possibile eliminare un intero gruppo di processi inviando un segnale a -1234 dove 1234 è il PGID (ID gruppo di processi), che è il PID del leader del gruppo di processi. Quando esegui una pipeline, l'intera pipeline inizia come un gruppo di processi (le applicazioni possono modificarlo chiamando setpgid o setpgrp ).

Quando avvii i processi in background (foo & ), si trovano nel proprio gruppo di processi. I gruppi di processi vengono utilizzati per gestire l'accesso al terminale; normalmente solo il gruppo di processi in primo piano ha accesso al terminale. I lavori in background rimangono nella stessa sessione, ma non è possibile interrompere un'intera sessione o addirittura enumerare i gruppi di processi o i processi in una sessione, quindi non aiuta molto.

Quando chiudi un terminale, il kernel invia il segnale SIGHUP a tutti i processi che lo hanno come terminale di controllo. Questi processi formano una sessione, ma non tutte le sessioni hanno un terminale di controllo. Per il tuo progetto, una possibilità è quindi quella di avviare tutti i processi nel proprio terminale, creato da script, schermo, ecc. Uccidi il processo dell'emulatore di terminale per uccidere i processi contenuti (supponendo che non si siano separati con setsid ).

Correlati:come uccidere il processo che tiene il blocco apt?

Puoi fornire un maggiore isolamento eseguendo i processi come il proprio utente, che non fa nient'altro. Quindi è facile uccidere tutti i processi:esegui kill (la chiamata di sistema o l'utilità) come quell'utente e usa -1 come argomento PID da uccidere, che significa "tutti i processi di quell'utente".

Puoi fornire un isolamento ancora maggiore, ma con una configurazione notevolmente maggiore eseguendo i processi contenuti in un contenitore reale.


Linux
  1. Come uccidere un processo zombie su Linux

  2. kill Esempi di comandi in Linux

  3. Come uccidere il processo di zombi

  4. Processi di uccisione in Raspbian

  5. Uccidi il processo in esecuzione sulla porta 80

Kill Command in Linux

Come uccidere i processi Zombie in Linux

5 modi rapidi per uccidere un processo in Linux

Come KILL un processo su Linux

Come uccidere i processi zombi in Ubuntu

4 modi per uccidere un processo:kill, killall, pkill, xkill