Come ottenere il pid dellultimo comando eseguito nello script di shell?

Voglio uno script di shell come questo:

my-app & echo $my-app-pid 

Ma lo faccio Non so come ottenere il pid del comando appena eseguito.

So che posso semplicemente usare il comando jobs -p my-app per grep il pid. Ma se voglio eseguire la shell più volte, questo metodo non funzionerà. Perché jobspec è ambiguo.

Answer

Il PID dellultimo comando eseguito è nel $! variabile di shell:

my-app & echo $! 

Commenti

  • Stampa pid come ad es. [1] 893. Voglio solo un numero.
  • Va notato che questo sta per programmi avviati in background . Se non sono stati avviati processi in background, il parametro non è impostato.
  • Unaltra soluzione degna è suggerita in (un commento a una risposta a) Come ottenere pid del processo appena avviato : oh, e " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24 novembre ' 10 alle 14:28
  • @ user3153014 Stringa come " [2] 2625 " vengono stampati dalla shell dopo lavvio dellattività in background. Questo non è correlato alloutput di echo $!
  • Di solito uso questo codice in uno script quando devo aspettare fino al termine del processo. my-app & myVar=$! ; fg. fg riporta il processo in primo piano. Posso quindi stampare echo $myVar più tardi e ' sono abbastanza sicuro che la mia app sia già terminata.

Risposta

Ottieni PID:

#!/bin/bash my-app & echo $! 

Salva PID nella variabile:

#!/bin/bash my-app & export APP_PID=$! 

Salva tutte le istanze PID nel file di testo:

#!/bin/bash my-app & echo $! >>/tmp/my-app.pid 

Salva output, errori e PID in file separati :

#!/bin/bash my-app >/tmp/my-app.log 2>/tmp/my-app.error.log & echo $! >>/tmp/my-app.pid echo "my-app PID"s: $(cat /tmp/my-app.pid)" 

Commenti

  • La domanda non ' Non chiedere informazioni sul reindirizzamento, quindi la tua risposta è per lo più la stessa di quella accettata tranne che se unistanza di my-app finisce e forse anche peggio il suo PID viene riutilizzato in seguito, tu ' avrà cattive informazioni nel tuo file. Non ' penso che questa risposta aggiunga molto valore alla risposta accettata esistente davvero
  • @EricRenouf post aggiornato!
  • un altro derivato che potrebbe essere utile. Questo ottiene il PID e allo stesso tempo lo tratta come un processo (principalmente) in primo piano: sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $? `
  • isnt APP = main & un modo per acquisire PID?

Risposta

Prova qualcosa come

pidof my_app >> /tmp/my_app.pid 

Commenti

  • comando esterno e lento, se il sistema può fornire direttamente il PID perché cercare in tutti i processi per trovare proprio quello ? inoltre, puoi ' essere certo che ' otterrai il valore corretto

Risposta

Prova qualcosa di simile:

 ps ef | grep "[m]y-app" | awk "{print $2}" 

Inserendo la prima lettera del processo tra [ ] si assicura di non visualizzare il processo grep nellelenco. Se necessario, puoi anche aggiungere un grep al tuo nome utente.

Commenti

  • Questo ' è molto fragile nella migliore delle ipotesi e ' non funziona se my-app viene eseguito più di una volta – davidshen84 si preoccupa specificamente di questo cas.
  • Se segui questa strada, dovresti invece utilizzare pgrep.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *