Kuinka saada viimeksi suoritetun komennon pid komentotulkkikomentona?

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

Viimeksi suoritetun komennon PID on $! kuorimuuttuja:

my-app & echo $! 

Kommentit

  • Se tulostaa pid, kuten esim. [1] 893. Haluan vain numeron.
  • On huomattava, että tämä tarkoittaa ohjelmia, jotka on aloitettu taustalla . Jos taustatapahtumia ei ole aloitettu, parametria ei ole asetettu.
  • Toinen arvoinen ratkaisu on ehdotettu (kommentti vastaukseen) Kuinka saada pid juuri aloitetun prosessin : oi, ja " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24. marraskuuta ' 10 klo 14:28
  • @ user3153014 Merkkijonot, kuten " [2] 2625 " tulostetaan kuorella taustatehtävän aloittamisen jälkeen. Tämä ei liity echo $!
  • -lähtöön. Käytän tällaista koodia yleensä komentosarjassa, kun minun on odotettava prosessin päättymistä. my-app & myVar=$! ; fg. fg tuo prosessin uudelleen etualalle. Voin sitten tulostaa echo $myVar myöhemmin ja olen ' m melko varma, että my-app on jo valmis.

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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *