Jeg vil ha et skallskript som dette:
my-app & echo $my-app-pid
Men det gjør jeg vet ikke hvordan du får pid for den nettopp utførte kommandoen.
Jeg vet at jeg bare kan bruke jobs -p my-app
-kommandoen for å gripe pid. Men hvis jeg vil utføre skallet flere ganger, vil denne metoden ikke fungere. Fordi jobspec er tvetydig.
Svar
Svar
Få PID
:
#!/bin/bash my-app & echo $!
Lagre PID
i variabel:
#!/bin/bash my-app & export APP_PID=$!
Lagre alle forekomster PID
i tekstfil:
#!/bin/bash my-app & echo $! >>/tmp/my-app.pid
Lagre utdata, feil og PID
i atskilte filer :
#!/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)"
Kommentarer
- Spørsmålet klarte ikke ' t spør om omdirigering, så er svaret ditt stort sett det samme som det aksepterte, bortsett fra at hvis en forekomst av
my-app
avsluttes, og kanskje enda verre blir PID-en gjenbrukt senere, du ' Det vil ha dårlig informasjon i filen din. Jeg tror ikke ' at dette svaret gir mye av verdien til det eksisterende aksepterte svaret virkelig - @EricRenouf innlegget er oppdatert!
- et annet derivat som kan være nyttig. Dette får PID og behandler det samtidig som en (for det meste) forgrunnsprosess:
sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?
` - isnt APP =
main &
en måte å hente PID på?
Svar
Prøv noe sånt som
pidof my_app >> /tmp/my_app.pid
Kommentarer
- ekstern kommando, og sakte, hvis systemet kan gi PID direkte hvorfor søke gjennom alle prosesser for å finne akkurat det ? kan også ' ikke være sikker på at du ' får riktig verdi
Svar
Prøv noe sånt som dette:
ps ef | grep "[m]y-app" | awk "{print $2}"
Plasser den første bokstaven i prosessen mellom [
]
sørger for at du ikke får grep
-prosessen i listen din. Hvis det er nødvendig, kan du også legge til en grep i brukernavnet ditt.
Kommentarer
- Det ' er veldig skjøre i beste fall og fungerer ikke ' hvis
my-app
utføres mer enn en gang – davidshen84 bekymrer seg spesifikt om det cas. - Hvis du til og med går denne ruten, bør du bruke
pgrep
i stedet.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24. nov ' 10 kl 14:28echo $!
my-app & myVar=$! ; fg
.fg
bringer prosessen i forgrunnen igjen. Jeg kan deretter skrive utecho $myVar
senere, og jeg ' er ganske sikker på at appen min allerede er ferdig.