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