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
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-appse 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
sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $? `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-appeste 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.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &– sysfault 24 nov ' 10 la 14:28echo $!my-app & myVar=$! ; fg.fgaduce procesul din nou în prim plan. Pot apoi să tipărescecho $myVarmai târziu și ' sunt destul de sigur că aplicația mea a terminat deja.