Haluan, että tarvitsen seuraavanlaisen komentotiedoston:
my-app & echo $my-app-pid
Mutta kyllä en tiedä miten juuri suoritetun komennon get pid.
Tiedän, että voin vain käyttää jobs -p my-app
-komentoa pidättämään pid. Mutta jos haluan suorittaa komentotulkin useita kertoja, tämä menetelmä ei toimi. Koska jobspec on epäselvä.
Answer
Vastaa
Hanki PID
:
#!/bin/bash my-app & echo $!
Tallenna PID
muuttujaan:
#!/bin/bash my-app & export APP_PID=$!
Tallenna kaikki esiintymät PID
tekstitiedostossa:
#!/bin/bash my-app & echo $! >>/tmp/my-app.pid
Tallenna tulosteet, virheet ja PID
erillisiin tiedostoihin :
#!/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)"
kommentit
- kysymystä ei ' Kysy uudelleenohjauksesta, vastauksesi on pääosin sama kuin hyväksytty paitsi, että jos
my-app
-esiintymä päättyy, ja ehkä vielä pahempaa, sen PID-tunnusta käytetään myöhemmin myöhemmin, ' ll-tiedostossasi on virheellisiä tietoja. En usko ' usko, että tämä vastaus lisää paljon arvoa nykyiseen hyväksyttyyn vastaukseen todella - @EricRenouf viesti päivitetty!
- toinen johdannainen, joka voi olla hyödyllistä. Tämä saa PID: n ja samalla käsittelee sitä (enimmäkseen) etualan prosessina:
sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?
` - ei APP =
main &
tapa napata PID?
Vastaa
Kokeile jotain sellaista kuin
pidof my_app >> /tmp/my_app.pid
Kommentit
- ulkoinen komento, ja hidas, jos järjestelmä voi antaa PID: n suoraan miksi etsiä kaikkia prosesseja juuri sen löytämiseksi ? ja voi myös ' olla varma, että ' ll saa oikean arvon
Vastaa
Kokeile jotain tällaista:
ps ef | grep "[m]y-app" | awk "{print $2}"
Prosessin ensimmäisen kirjaimen sijoittaminen [
]
varmistaa, että et saa grep
-prosessia luetteloosi. Tarvittaessa voit myös lisätä grep-käyttäjänimeesi.
Kommentit
- Että ' on hyvin parhaimmillaan hauras ja ei toimi ' t, jos
my-app
suoritetaan useammin kuin kerran – davidshen84 huolehtii siitä erityisesti cas. - Jos edes valitset tämän reitin, käytä sen sijaan
pgrep
.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24. marraskuuta ' 10 klo 14:28echo $!
my-app & myVar=$! ; fg
.fg
tuo prosessin uudelleen etualalle. Voin sitten tulostaaecho $myVar
myöhemmin ja olen ' m melko varma, että my-app on jo valmis.