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
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-appfinisce 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-appviene eseguito più di una volta – davidshen84 si preoccupa specificamente di questo cas. - Se segui questa strada, dovresti invece utilizzare
pgrep.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &– sysfault 24 novembre ' 10 alle 14:28echo $!my-app & myVar=$! ; fg.fgriporta il processo in primo piano. Posso quindi stampareecho $myVarpiù tardi e ' sono abbastanza sicuro che la mia app sia già terminata.