Hvordan får jeg pid av den sist utførte kommandoen i skallskript?

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

PID for den sist utførte kommandoen er i $! skallvariabel:

my-app & echo $! 

Kommentarer

  • Det er utskrift pid som for f.eks. [1] 893. Jeg vil bare ha nummer.
  • Det skal bemerkes at dette står for programmer startet i bakgrunnen . Hvis ingen bakgrunnsprosesser er startet, er ikke parameteren satt.
  • En annen verdig løsning foreslås i (en kommentar til et svar på) Hvordan bli pid av nettopp startet prosess : oh, og " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24. nov ' 10 kl 14:28
  • @ user3153014 Streng s som " [2] 2625 " skrives ut med skall etter at bakgrunnsoppgaven er startet. Dette er ikke relatert til utdata fra echo $!
  • Jeg bruker vanligvis en slik kode i et skript når jeg må vente til prosessen avsluttes. my-app & myVar=$! ; fg. fg bringer prosessen i forgrunnen igjen. Jeg kan deretter skrive ut echo $myVar senere, og jeg ' er ganske sikker på at appen min allerede er ferdig.

Svar

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *