Hogyan lehet megkapni a legutóbb végrehajtott parancs pidjét shell szkriptben?

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

Az utoljára végrehajtott parancs PID-je a $! héj változó:

my-app & echo $! 

Megjegyzések

  • PID-t nyomtat, mint pl. [1] 893. Csak számot akarok.
  • Meg kell jegyezni, hogy ez a a háttérben elindított programokat jelenti. Ha még nem indultak el háttérfolyamatok, akkor a paraméter nincs beállítva.
  • Újabb érdemes megoldást javasol a (válaszhoz fűzött megjegyzés): Hogyan szerezzek pid a most indult folyamat : ja, és a " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault november 24. ' 10, 14:28
  • @ user3153014 Karakterláncok, mint " [2] 2625 A " fájlokat héj nyomtatja a háttérfeladat elindítása után. Ez nem kapcsolódik a echo $!
  • kimenetéhez.
  • Ilyen kódot általában egy szkriptben használok, amikor meg kell várnom, amíg a folyamat véget ér. my-app & myVar=$! ; fg. A fg ismét előtérbe hozza a folyamatot. Ezután később kinyomtathatom echo $myVar és ' biztos vagyok benne, hogy a my-app már befejeződött.

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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük