Shell-komentosarja odottaa taustakomentoa

Kirjoitan komentosarjaa, mutta tarvitsen jotain, jota en löydä tapaa tehdä se …

Minun on tehtävä komento taustalla ”command1 &” ja sitten jonnekin komentosarjassa minun on odotettava sen päättymistä ennen kuin suoritan command2. , Tarvitsen tätä:

HUOMAUTUS: jokainen komento toimii tietyssä hakemistossa! While-silmukan lopussa komentoni1 loi 4 hakemistoa, joissa jokaisessa suoritetaan tietty prosessi, joten prosessin kokonaismäärä käynnissä ovat 4

 a=1 while [$a -lt 4 ] . command1 #Generates 1 Process a= `export $a +1` done #Wait until the 4 process end and then run the command2 . command2  

Olen nähnyt jotain wait -komento pid-prosessinumerolla, mutta se ei toiminut myös.

Kommentit

  • Hallitsetko command1? Voitko muokata sitä niin, että se palauttaa neljän prosessin PID-tunnukset?
  • Kyllä! minulla on se jo 🙂
  • Olen päivittänyt vastaukseni vastaavasti. Kerro, vastaako se odotuksiasi.
  • Tämä Q liittyy tähän: unix.stackexchange.com/questions/100801/… . Ainoa ero on, että sinun on hankittava PID taustalla olevasta prosessista. Voit käyttää $! -muuttujaa saadaksesi tämän, välittämällä sen wait -komennolle, kuten näytin siellä. $! sisältää viimeisen taustalla olevan PID: n, kun taas $$ sisältää viimeisen prosessiajon ' PID .
  • OK, nyt skriptilläsi ei ole mitään järkeä. Ympäri ympärillä on syntaksivirheitä ja omituisuuksia. Voisitko näyttää meille todellisen käsikirjoituksen? Miksi hankit komentoja? Miksi et vain suorittaisi niitä?

Vastaa

Voit käyttää komentoa wait PID odottaa prosessin päättymistä.

Voit myös noutaa viimeisen komennon PID: n $!

In sinun tapauksessasi jotain tällaista toimisi:

command1 & #run command1 in background PID=$! #catch the last PID, here from command1 command2 #run command2 while command1 is running in background wait $PID #wait for command1, in background, to end command3 #execute once command1 ended 

Seuraamalla muokkaustasi, koska sinulla on useita PID-tunnuksia ja tunnet ne, voit tehdä sen:

command1 & #run command1 in background PID1=xxxxx PID2=yyyyy PID3=xxyyy PID4=yyxxx command2 #run command2 while command1 is running in background wait $PID1 $PID2 $PID3 $PID4 #wait for the four processes of command1, in background, to end command3 #execute once command1 ended 

Kommentit

  • Muokkauksesi jälkeen tiedät luotun PID: n (xxxxx, yyyyy, xxyyy, yyxxx ), voit käyttää myös odottelua, jossa on luettelo odottavista PID-tunnuksista (katso mies). Jos et tiedä heitä ', ehkä voit kerätä ne komentoon1 (mikä on komento1? Oma komentosarjasi?)
  • Todennäköisesti parasta varmistaa, että ne ovat ' on ensin ryhmitelty oikein. Katso vastauksestani idea siitä, miten se voidaan tehdä.

Vastaa

Puhtain tapa tehdä tämä merkitsisi sitä, että comamnd1 palauttaisi käynnistettyjen prosessien PID: t ja käyttämällä jokaisessa niistä wait, kuten @LaurentC ”s vastaus .

Toinen lähestymistapa olisi noin seuraava:

## Create a log file logfile=$(mktemp) ## Run your command and have it print into the log file ## when it"s finsihed. command1 && echo 1 > $logfile & ## Wait for it. The [ ! -s $logfile ] is true while the file is ## empty. The -s means "check that the file is NOT empty" so ! -s ## means the opposite, check that the file IS empty. So, since ## the command above will print into the file as soon as it"s finished ## this loop will run as long as the previous command si runnning. while [ ! -s $logfile ]; do sleep 1; done ## continue command2 

Kommentit

  • anteeksi, mutta silti ei toimi. Parannan kysymystani vielä kerran!

Vastaa

Jos käytät seuraavaa menetelmää, et ehkä tarvitse erillistä ”odota kaikkia prosesseja” while-silmukan jälkeen. Silmukka odottaa nykyistä command1 loppuun ennen kuin se siirtyy takaisin alkuun. Ole varovainen kuten kaikkien neuvojen kohdalla. Huomaa, että ainoa asia, jonka tein, oli lisätä & wait $! command1.

a=1 while [$a -lt 4 ] . command1 & wait $! #Generates 1 Process a= `export $a +1` done 

Vastaa

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