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-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
.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24 novembre ' 10 alle 14:28echo $!
my-app & myVar=$! ; fg
.fg
riporta il processo in primo piano. Posso quindi stampareecho $myVar
più tardi e ' sono abbastanza sicuro che la mia app sia già terminata.