GNU/Linux >> Linux Esercitazione >  >> Linux

Come avviare un processo nel proprio gruppo di processi?

Cosa intendi per "avviare un processo nel proprio gruppo di processi"? La shell avvia i processi nei propri gruppi di processi, ecco come esegue il controllo dei processi (avendo un gruppo di processi per i processi in primo piano e diversi gruppi di processi per ogni pipeline avviata in background).

Per vedere che la shell lancia un nuovo gruppo di processi per ogni pipeline, puoi fare questo:

ps fax -o pid,pgid,cmd | less

che mostrerà qualcosa come:

11816 11816  |   \_ /bin/bash
4759   4759  |       \_ ps fax -o pid,pgid,cmd
4760   4759  |       \_ less

Tieni presente che la shell ha creato un nuovo gruppo di processi per la pipeline e ogni processo nella pipeline condivide il gruppo di processi.

Modifica:

Penso di sapere a cosa stai arrivando. Stai chiamando system di Perl. A quanto pare, sh -c non crea nuovi gruppi di processi, poiché è una shell senza controllo del lavoro.

Quello che farei sarebbe fork , quindi sul figlio:

setpgrp;
system("ps fax -o pid,pgid,cmd");

e wait sul genitore.


EDIT:se quello che volevi fare era utilizzare setsid ma trovare l'id di sessione e/o il pid del processo risultante:

Se avvii un processo tramite il comando setsid, non verrà collegato al tuo terminale, quindi ovviamente non risponderà a ctrl-c.

Potresti trovarlo sfogliando l'output di

ps x -O sid 

o qualcosa di più limitato come

ps x -o %c,%p,sid

O semplice trolling attraverso proc/[pid]/stat per tutte le voci e guardando l'id della sessione e qualsiasi altra cosa sia di interesse (vedi man proc per i dettagli)

La pagina man per setsid non fornisce alcun flag per generare direttamente l'output, ma potresti banalmente creare la tua versione che stampa le informazioni desiderate, modificando lo standard.

Ad esempio, prendi una copia di setsid.c da uno dei risultati per

http://www.google.com/codesearch?as_q=setsid&as_package=util-linux

Commenta nls include, le impostazioni locali e la macro di errore _("") che causerà problemi e quindi aggiungi questo subito prima della riga execvp:

    printf("process will be pid %d sid %d\n", getpid(), getsid(0));

Linux
  1. Come uccidere un processo zombie su Linux

  2. Come avviare il comando Linux in background e scollegare il processo nel terminale

  3. Come installare vtop su Linux

  4. Come faccio a far funzionare in background il mio server web Golang?

  5. Linux - Come posso vedere quando è iniziato un processo?

Come uccidere un processo in Linux

Come aggiungere un utente al gruppo in Linux

Come elencare i gruppi in Linux

Come avviare e terminare un processo in Ubuntu 20.04 LTS

Come trovare il nome del processo dal suo PID

Se conosco il numero PID di un processo, come posso ottenere il suo nome?