Hur får man pid för det senast körda kommandot i skalskript?

Jag vill ha ett skalskript så här:

my-app & echo $my-app-pid 

Men jag gör vet inte hur man får pid för kommandot just kört.

Jag vet att jag bara kan använda kommandot jobs -p my-app för att grep pid. Men om jag vill köra skalet flera gånger kommer den här metoden inte att fungera. Eftersom jobspec är tvetydig.

Svar

PID för det senast utförda kommandot finns i $! skalvariabel:

my-app & echo $! 

Kommentarer

  • Det skriver ut pid som för t.ex. [1] 893. Jag vill bara ha nummer.
  • Det bör noteras att detta står för program som startas i bakgrunden . Om inga bakgrundsprocesser har startats är parametern inte inställd.
  • En annan värdig lösning föreslås i (en kommentar till ett svar på) Hur får man pid av just påbörjad process : åh och " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24 nov ' 10 vid 14:28
  • @ user3153014 Strängar som " [2] 2625 " skrivs ut med skal efter att bakgrundsuppgiften startat. Detta är inte relaterat till utdata från echo $!
  • Jag brukar använda en sådan kod i ett skript när jag behöver vänta tills processen är slut. my-app & myVar=$! ; fg. fg tar processen till förgrunden igen. Jag kan sedan skriva ut echo $myVar senare och jag ' är ganska säker på att min app redan är klar.

Svar

Skaffa PID:

#!/bin/bash my-app & echo $! 

Spara PID i variabel:

#!/bin/bash my-app & export APP_PID=$! 

Spara alla instanser PID i textfil:

#!/bin/bash my-app & echo $! >>/tmp/my-app.pid 

Spara utdata, fel och PID i separata 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

  • Frågan ' t fråga om omdirigering, då är ditt svar mestadels detsamma som det accepterade förutom att om en instans av my-app slutar, och kanske ännu värre, dess PID återanvänds senare, du ' Jag har dålig information i din fil. Jag tror inte ' att det här svaret tillför mycket värde till det befintliga accepterade svaret verkligen
  • @EricRenouf inlägg uppdaterat!
  • ytterligare ett derivat som kan vara användbart. Detta får PID och behandlar det samtidigt som en (mestadels) förgrundsprocess: sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $? `
  • isnt APP = main & ett sätt att ta tag i PID?

Svar

Prova något liknande

pidof my_app >> /tmp/my_app.pid 

Kommentarer

  • externt kommando, och långsamt, om systemet kan ge PID direkt varför man söker igenom alla processer för att hitta just det ? och kan också ' vara säker på att du ' får rätt värde

Svar

Prova något så här:

 ps ef | grep "[m]y-app" | awk "{print $2}" 

Placera första bokstaven i processen mellan [ ] ser till att du inte får grep -processen i din lista. Om det behövs kan du också lägga till en grep i ditt användarnamn.

Kommentarer

  • Det ' är mycket bräckligt i bästa fall och fungerar inte ' om my-app körs mer än en gång – davidshen84 oroar sig specifikt för det cas.
  • Om du ens går den här vägen bör du använda pgrep istället.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *