Elenca gli ID processo figlio
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
Voglio ottenere un elenco di tutti gli ID processo figlio per un determinato ID processo genitore (
6330 qemu) da utilizzare in unobashscript.
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 comeps -ALfarebbe. Se si preme la maiuscolaHsi 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
htopopstree.
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).