Shell szkript várjon a háttérparancsra

Írok egy szkriptet, de van valami, amire szükségem van, de nem találok rá módot …

Parancsot kell készítenem a “command1 &” háttérben, majd valahol a szkriptben meg kell várnom, amíg befejeződik, mielőtt végrehajtom a 2. parancsot. , Szükségem van erre:

MEGJEGYZÉS: minden parancs egy adott könyvtárban fut! A while ciklus végén a command1 létrehozott 4 könyvtárat, ahol mindegyikben futtatja az adott folyamatot, így a folyamat teljes része futnak 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  

Láttam valamit egy wait parancs a pid folyamatszámmal, de ez szintén nem működött.

Megjegyzések

  • Ön vezérli a command1? Módosíthatja úgy, hogy visszaadja a 4 folyamat PID-jét?
  • Igen! ez már megvan 🙂
  • Ennek megfelelően frissítettem a válaszomat. Mondja meg, hogy egyezik-e a várakozásaival.
  • Ez a Q ehhez kapcsolódik: unix.stackexchange.com/questions/100801/… . Az egyetlen különbség az, hogy a PID-t háttérrel rendelkező folyamatból kell megszereznie. Használhatja a $! változót ennek megszerzéséhez, továbbítva a wait parancsnak, ahogy ott mutattam. A $! tartalmazza az utolsó háttérrel ellátott PID-t, míg a $$ az utolsó folyamatfuttatást tartalmazza: ' s PID .
  • OK, most a szkriptednek semmi értelme. Szintaxis hibák és furcsaságok vannak mindenütt. Megmutathatná a tényleges szkriptet? Miért szerzi be a parancsokat? Miért ne csak végrehajtaná őket?

Válasz

Használhatja a wait PID a folyamat befejezésének megvárására.

Az utolsó parancs PID-jét is lekérheti a $!

In a te esetedben valami ilyesmi működne:

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 

A szerkesztést követve, mivel több PID-vel rendelkezel és ismered őket, megteheted:

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 

Megjegyzések

  • A szerkesztést követően, ha tudja a létrehozott PID-t (xxxxx, yyyyy, xxyyy, yyxxx ), használhatja a várakozást is, a várakozó PID-k listájával (lásd az embert). Ha d ' ismeri őket, talán összegyűjtheti őket a command1-be (mi a command1? Egy saját szkript?)
  • Valószínűleg a legjobb annak biztosítására, hogy ' elsősorban helyesen csoportosult. Nézze meg a válaszomat, hogy megtudjam, hogyan lehetne csinálni.

Válasz

A legtisztább módszer erre az lenne, ha a comamnd1 visszaadná az elindított folyamatok PID-jeit, és mindegyiken a wait t használná, a @LaurentC “s válasz .

Egy másik megközelítés valami ilyesmi lehet:

## 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 

Megjegyzések

  • sajnálom, de még mindig nem működik. Még egyszer javítom a kérdésemet!

Válasz

Ha a következő módszert használja, előfordulhat, hogy a while ciklus után nincs szüksége külön “várakozás az összes folyamatra” kifejezésre. A ciklus megvárja az aktuális command1 befejezéséhez, mielőtt az visszalépne a tetejére. Kérjük, legyen óvatos, mint minden tanácsnál. Figyelem, az egyetlen dolog, amit tettem, az volt, hogy & wait $! -t adtam a command1.

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük