Cum se obține pid-ul ultimei comenzi executate în scriptul shell?

Vreau să am un script de tip shell astfel:

my-app & echo $my-app-pid 

Dar da nu știu cum se obține pid-ul comenzii tocmai executate.

Știu că pot folosi doar comanda jobs -p my-app pentru a grep pid. Dar dacă vreau să execut shell-ul de mai multe ori, această metodă nu va funcționa. Deoarece jobspec este ambiguu.

Răspuns

PID-ul ultimei comenzi executate se află în $! variabilă shell:

my-app & echo $! 

Comentarii

  • Se tipărește pid ca de ex. [1] 893. Vreau doar numărul.
  • Trebuie remarcat faptul că acesta înseamnă programe începute în fundal . Dacă nu au fost demarate procese de fundal, parametrul nu este setat.
  • O altă soluție demnă este sugerată în (un comentariu la un răspuns la) Cum se obține pid a procesului abia început : oh și " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24 nov ' 10 la 14:28
  • @ user3153014 Șiruri ca " [2] 2625 " sunt tipărite de shell după pornirea activității de fundal. Acest lucru nu este legat de ieșirea echo $!
  • De obicei folosesc un astfel de cod într-un script când trebuie să aștept până se încheie procesul. my-app & myVar=$! ; fg. fg aduce procesul din nou în prim plan. Pot apoi să tipăresc echo $myVar mai târziu și ' sunt destul de sigur că aplicația mea a terminat deja.

Răspuns

Obține PID:

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

Salvați PID în variabilă:

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

Salvați toate instanțele PID în fișier text:

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

Salvați rezultatele, erorile și PID în fișiere separate :

#!/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)" 

Comentarii

  • Întrebarea nu ' nu întrebați despre redirecționare, atunci răspunsul dvs. este în mare parte același cu cel acceptat, cu excepția cazului în care o instanță de my-app se termină și poate chiar mai rău, PID-ul său este refolosit mai târziu, div id = „8f160a87db”>

voi avea informații greșite în fișierul dvs. Nu ' nu cred că acest răspuns adaugă multă valoare răspunsului acceptat existent într-adevăr

  • Postul actualizat @EricRenouf!
  • un alt derivat care ar putea fi util. Acest lucru obține PID și, în același timp, îl tratează ca un proces (majoritar) de prim plan: sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $? `
  • isnt APP = main & o modalitate de a lua PID?
  • Răspunde

    Încearcă ceva de genul

    pidof my_app >> /tmp/my_app.pid 

    Comentarii

    • comandă externă și lent, dacă sistemul poate da direct PID de ce căutarea prin toate procesele pentru a găsi exact asta ? și, de asemenea, ' nu puteți fi sigur că ' veți obține valoarea corectă

    Răspundeți

    Încercați ceva de genul acesta:

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

    Plasarea primei litere a procesului dvs. între [ ] vă asigură că nu primiți procesul grep în listă. Dacă este necesar, puteți adăuga și un grep pe numele dvs. de utilizator.

    Comentarii

    • Asta este ' fragil în cel mai bun caz și nu ' funcționează dacă my-app este executat de mai multe ori – davidshen84 își face griji în mod special cas.
    • Dacă mergeți chiar pe această rută, ar trebui să utilizați pgrep în schimb.

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *