Hvordan får man pid for den sidst udførte kommando i shell-script?

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

PID for den sidst udførte kommando er i $! skalvariabel:

my-app & echo $! 

Kommentarer

  • Det udskriver pid som f.eks. [1] 893. Jeg vil kun have et nummer.
  • Det skal bemærkes, at dette står for programmer startet i baggrunden . Hvis der ikke er startet nogen baggrundsprocesser, er parameteren ikke indstillet.
  • En anden værdig løsning foreslås i (en kommentar til et svar på) Sådan får du pid af netop startet proces : åh, og " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24. november ' 10 kl. 14:28
  • @ user3153014 Streng som " [2] 2625 " udskrives med shell efter start af baggrundsopgaven. Dette er ikke relateret til output af echo $!
  • Jeg bruger normalt en sådan kode i et script, når jeg skal vente, indtil processen slutter. my-app & myVar=$! ; fg. fg bringer processen i forgrunden igen. Jeg kan derefter udskrive echo $myVar senere, og jeg ' er temmelig sikker på, at min-app allerede er færdig.

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *