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
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.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24 nov ' 10 vid 14:28echo $!
my-app & myVar=$! ; fg
.fg
tar processen till förgrunden igen. Jag kan sedan skriva utecho $myVar
senare och jag ' är ganska säker på att min app redan är klar.