Ilyen shell parancsfájlt szeretnék:
my-app & echo $my-app-pid
De igen nem tudom, hogy az éppen végrehajtott parancs get pid.
Tudom, hogy csak a jobs -p my-app
parancsot használhatom a pid megfogására. De ha többször akarom végrehajtani a héjat, ez a módszer nem fog működni. Mivel a jobspec kétértelmű.
Válasz
Válasz
Get PID
:
#!/bin/bash my-app & echo $!
PID
mentése a változóba:
#!/bin/bash my-app & export APP_PID=$!
Minden példány mentése PID
szövegfájlban:
#!/bin/bash my-app & echo $! >>/tmp/my-app.pid
A kimenet, a hibák és az PID
fájlok mentése külön fájlokba :
#!/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)"
Megjegyzések
- A kérdés nem ' t kérdezzen az átirányításról, akkor a válasza többnyire megegyezik az elfogadottéval, azzal a különbséggel, hogy ha a
my-app
példány befejeződik, és talán még rosszabb, hogy a PID később újra felhasználásra kerül, akkor ' ll rossz információ található a fájlban. Nem gondolom, hogy ' nem gondolom, hogy ez a válasz nagy értéket ad a meglévő elfogadott válaszhoz. - @EricRenouf bejegyzés frissítve!
- egy másik származék, amely hasznos lehet. Ez megkapja a PID-t, és egyúttal (többnyire) előtér folyamatként kezeli:
sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?
` - nem APP =
main &
a PID megragadásának módja?
Válasz
Próbáljon ki valami hasonlót
pidof my_app >> /tmp/my_app.pid
Megjegyzések
- külső parancs, és lassú, ha a rendszer közvetlenül meg tudja adni a PID-t, miért keres az összes folyamatban, hogy csak ezt találja meg ? és ' nem lehet biztos abban, hogy ' megfelelő értéket kap
Válasz
Próbálja ki a következőket:
ps ef | grep "[m]y-app" | awk "{print $2}"
A folyamat első betűjének elhelyezése [
]
biztosítja, hogy a grep
folyamat ne szerepeljen a listában. Ha szükséges, hozzáadhat egy grep-et is a felhasználónevéhez.
Megjegyzések
- Ez ' legjobb esetben törékeny, és nem működik ', ha a
my-app
-et többször is végrehajtják – a davidshen84 kifejezetten aggódik emiatt cas. - Ha még ezen az úton is jár, akkor inkább a
pgrep
szót kell használnia.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault november 24. ' 10, 14:28echo $!
my-app & myVar=$! ; fg
. Afg
ismét előtérbe hozza a folyamatot. Ezután később kinyomtathatomecho $myVar
és ' biztos vagyok benne, hogy a my-app már befejeződött.