Elenca gli ID processo figlio

Oct 02 2020

Voglio ottenere un elenco di tutti gli ID processo figlio per un determinato ID processo genitore ( 6330 qemu) da utilizzare in uno bashscript.

Li posso vedere htop, ad esempio:

I principali risultati di ricerca includono:

# pgrep -P 6330
(no output)

# ps --ppid 6330
  PID TTY          TIME CMD

# pstree -p 6330
qemu(6330)-+-{qemu}(6332)
           |-{qemu}(6333)
           |-{qemu}(6340)
           |-{qemu}(6342)
           |-{qemu}(6343)
           `-{qemu}(6344)

... l'output di questi è lo stesso se eseguito come rooto come l'utente proprietario qemu.

L' pstreeoutput è utilizzabile come ultima risorsa, ma preferirei non analizzarlo se posso evitarlo.

Inoltre ... ps aux | grep 6332e pgrep 6332non produce nulla ... quindi anche questo è un po 'sconcertante.

Dovrebbe essere facile, vero?

Apprezzo il tuo tempo.

Risposte

2 KamilMaciorowski Oct 02 2020 at 10:35

Voglio ottenere un elenco di tutti gli ID processo figlio per un determinato ID processo genitore ( 6330 qemu) da utilizzare in uno bashscript.

La soluzione a questo problema esatto è pgrep -P 6330, ma il resto della domanda suggerisce che forse gli "ID processo figlio" non sono ciò che desideri veramente.

Hai usato pgrep -P 6330e l'output era vuoto perché non c'erano processi figlio. Cosa htope ha pstreemostrato che eri thread . Quindi forse vuoi davvero gli ID dei thread.

Vedi questi:

  • Perché ci sono molti processi elencati con lo stesso titolo in htop?

    htopmostra i singoli thread come processi separati per impostazione predefinita, in modo simile a come ps -ALfarebbe. Se si preme la maiuscola Hsi passerà a mostrare solo i processi principali (premendo di nuovo si torna indietro).

  • man 1 pstree:

    I thread secondari di un processo si trovano sotto il processo genitore e vengono visualizzati con il nome del processo tra parentesi graffe [...]

  • I thread sono implementati come processi su Linux?

    Linux era solito assegnare diversi PID ai thread. Dal momento che Linux 2.4 i thread di un processo condividono il suo PID; questo per soddisfare POSIX. La terminologia è diventata più complicata, "PID" è un po 'ambiguo. Da una risposta pertinente su SO :

    La prima e più importante cosa da capire è che "PID" significa cose diverse nello spazio del kernel e nello spazio utente. Ciò che il kernel chiama PID sono in realtà gli ID dei thread a livello di kernel (spesso chiamati TID), […]. Ogni thread sul sistema, sia nello stesso processo che in uno diverso, ha un TID univoco (o "PID" nella terminologia del kernel).

    Ciò che è considerato un PID nel senso POSIX di "processo", d'altra parte, è chiamato "ID gruppo thread" o "TGID" nel kernel. Ciascun processo è costituito da uno o più thread (processi kernel) ciascuno con il proprio TID (kernel PID), ma tutti condividono lo stesso TGID, che è uguale al TID (kernel PID) del thread iniziale in cui viene eseguito main.

    Quando topti mostra i thread, mostra i TID (kernel PID), non i PID (kernel TGID), ed è per questo che ogni thread ne ha uno separato.

    L'ultima frase si applica anche a htopo pstree.

Se si vuole ancora ottenere questi diversi ID ( 6332, 6333, ...) da utilizzare in uno script di shell, richiamare questo:

ps -o lwp= -Lp 6330

Il comando non è portabile, può o non può funzionare nel tuo sistema operativo. Se funziona, potresti voler escludere il thread principale:

ps -o lwp= -Lp 6330 | grep -v '^ *6330$'

( <space>*perché ps(almeno il mio ps) aggiunge spazi iniziali).