Jeg vil have et shell-script som dette:
my-app & echo $my-app-pid
Men det gør jeg ved ikke, hvordan man får piden for den netop udførte kommando.
Jeg ved, jeg kan bare bruge kommandoen jobs -p my-app
til at gribe pid. Men hvis jeg vil udføre skallen flere gange, fungerer denne metode ikke. Fordi jobspec er tvetydig.
Svar
Svar
Hent PID
:
#!/bin/bash my-app & echo $!
Gem PID
i variabel:
#!/bin/bash my-app & export APP_PID=$!
Gem alle forekomster PID
i tekstfil:
#!/bin/bash my-app & echo $! >>/tmp/my-app.pid
Gem output, fejl og PID
i adskilte 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ørgsmålet ikke ' t spørge om omdirigering, så er dit svar stort set det samme som det accepterede, bortset fra at hvis en forekomst af
my-app
slutter, og måske endnu værre, bliver dens PID genbrugt senere, du ' Jeg har dårlige oplysninger i din fil. Jeg tror ikke ' dette svar tilføjer meget værdi til det eksisterende accepterede svar virkelig - @EricRenouf indlæg opdateret!
- et andet afledt, der kan være nyttigt. Dette får PID og behandler det samtidig som en (for det meste) forgrundsproces:
sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?
` - isnt APP =
main &
en måde at få fat i PID på?
Svar
Prøv noget som
pidof my_app >> /tmp/my_app.pid
Kommentarer
- ekstern kommando, og langsomt, hvis systemet kan give PID direkte, hvorfor man søger gennem alle processer for at finde netop det ? og kan ' ikke være sikker på, at du ' får den korrekte værdi
Svar
Prøv noget som dette:
ps ef | grep "[m]y-app" | awk "{print $2}"
Placer det første bogstav i din proces mellem [
]
sørger for, at du ikke får grep
-processen på din liste. Hvis det er nødvendigt, kan du også tilføje en grep til dit brugernavn.
Kommentarer
- Det ' er meget skrøbelig i bedste fald og fungerer ikke ' hvis
my-app
udføres mere end én gang – davidshen84 specifikt bekymrer sig om det cas. - Hvis du endda følger denne rute, skal du bruge
pgrep
i stedet.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24. november ' 10 kl. 14:28echo $!
my-app & myVar=$! ; fg
.fg
bringer processen i forgrunden igen. Jeg kan derefter udskriveecho $myVar
senere, og jeg ' er temmelig sikker på, at min-app allerede er færdig.