Í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
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
command1
? Módosíthatja úgy, hogy visszaadja a 4 folyamat PID-jét?$!
változót ennek megszerzéséhez, továbbítva await
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 .