Il PID di un processo figlio bash (imapsync) - come lo ottieni?


15

Qualcuno può dirmi come ottenere il PID di un comando eseguito in bash.

Ad esempio, ho uno script bash che esegue imapsync.

Quando lo script viene ucciso, il processo imapsync non viene sempre ucciso, quindi mi piacerebbe essere in grado di identificare il PID di imapsync in modo programmatico dal mio script, in modo da poter terminare il processo imapsync in un gestore di segnali.

Quindi, come posso ottenere a livello di codice il PID di un processo figlio da uno script bash parent?


1
Che ne dici di "pidof imapsync"? Che cosa c'è che non va?
pitr

2
Non sapevo di Pidof. Tuttavia, ora che lo faccio, non è utile per questo scenario, per quanto posso dire, perché pidof sembra restituire tutti i processi del comando dato su un sistema - anche quelli di proprietà di altri script / utenti. Inoltre imapsync è in realtà uno script perl, quindi farei un pidof perl, che probabilmente restituirà processi che non sono imapsync e potrebbero appartenere ad altri utenti.
Jason Tan,

Javier ha ragione. Questa pagina offrirà ulteriori informazioni su ProcessManagement .
sinping

Risposte:


4

imapsync ha un'opzione per impostare dove è scritto il suo pid:

--pidfile: il file in cui è scritto imapsync pid.


Cordiali saluti, questo non risponde alla mia domanda in senso generale, ma ho scoperto l'arg --pidfile e con un po 'di dissolvenza è stato abbastanza buono finora ..
Jason Tan

@JasonTan perché insegnare a un uomo a pescare, quando puoi dargli un gustoso filetto precotto, così ritorna e ti assilla di più, domani, eh? scusa per il vecchio post, ma perché accettare questa risposta su quella di Javiers?
non sincronizzato

46
any_command args &
my_child_PID=$!

IOW, proprio come $$detiene il tuo PID, $!ha il PID del comando in background eseguito più di recente .


Grazie, ma imapsync non è in background e $! non è impostato se l'ho ripetuto sulla riga successiva dopo la chiamata imapsync o la prima riga del gestore del segnale. :-(
Jason Tan,

6
se biforca e fa da sfondo al bambino, è responsabilità del genitore salvare il PID del bambino da qualche parte. la pratica abituale è salvarla da qualche parte come /var/run/whatever.pid. Forse c'è un'opzione da riga di comando per chiedergli di salvare il PID da qualche parte; in caso contrario, sembra una caratteristica da chiedere all'autore o implementare te stesso.
Javier,

1
Enfasi sullo sfondo . Se non è stato inserito alcun processo in background (ovvero, con allegato &), la $!variabile non è definita.
Trevor,

1
Altre soluzioni simili sono suggerite in (una risposta a) Come ottenere il pid del processo appena iniziato ; come aggiunta a questa risposta, un commento lì dice: oh, e "l'oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 novembre 10 alle 14:28
imz - Ivan Zakharyaschev

10

Diversamente pidof, pgreppuò essere data una varietà di opzioni per limitare per quali processi restituisce i PID. Uno che può essere particolarmente utile è selezionare in base al PPID utilizzando il PID del processo corrente.

pgrep -P $$ imapsync

che produrrà PID di imapsync solo se sono figli del tuo script.


0

Che ne dici di mettere momentaneamente imapsync in background, ottenere il PID e poi metterlo in primo piano ... Qualcosa del genere:

imapsync &
pid=$!
wait $pid
retVal=$?
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.