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
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
command1
? Voitko muokata sitä niin, että se palauttaa neljän prosessin PID-tunnukset?$!
-muuttujaa saadaksesi tämän, välittämällä senwait
-komennolle, kuten näytin siellä.$!
sisältää viimeisen taustalla olevan PID: n, kun taas$$
sisältää viimeisen prosessiajon ' PID .