Jak mohu spustit proces na pozadí a zkontrolovat, kdy končí v bash skriptu? Můj nápad je takový skript:
launch backgroundprocess & while [ Process is running ];do echo "PROCESS IS RUNNING\r" done; echo "PROCESS TERMINATED"
Odpověď
Klíč je příkaz „počkat“:
#!/bin/bash /my/process & /another/process & wait echo "All processes done!"
Komentáře
odpověď
pomocí wait
můžete mít požadovanou přesnost:
sleep 1 & PID1=$! sleep 2 & PID2=$! wait $PID1 echo "PID1 has ended." wait echo "All background processes have exited."
odpověď
Existuje jeden způsob, jak to udělat:
launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" exit 0
Komentáře
- Díky, toto je rozhodně jediná odpověď, která odpovídá na mou interpretaci původní otázky (a důvod, proč jsem se na tuto otázku nakonec podíval)
- @cuonglm, Co existuje více procesů? Pravděpodobně
wait
je k tomu vhodnější? - @cuonglm co dělá -0 možnost zabít příkaz
- @k_vishwanath hlásí, zda proces stále běží nebo ne.
Odpovědět
Svůj proces můžete spustit pomocí nohup a psát skript pro čtení soubor nohup.out, který nohup používá k přihlášení.
nohup command &
Komentáře
- (1) Na riziko rozštěpení vlasů,
nohup
nepíše ' nic donohup.out
; pouze vytvoří soubor a přesměruje na něj výstup příkazu. (2) Pokud příkaz ' t neprodukuje žádný výstup, donohup.out
se nic nezapíše a tato myšlenka se nikam nedostane. (3) I kdyžcommand
zapisuje výstup, jak poznáte, že končí, sledováním tohoto výstupu? - @ G- Člověk možná kontrolou výstupu
lsof
a zjistit, zdanohup
stále používánohup.out
, ale souhlasím, že se jedná o velmi chlupatou metodu. - (4) Než začne
command
běžet,nohup
je pryč. (1) Ano, opakuji číslo, protože opakuji to, co jsem řekl před dvěma lety:nohup
nepíše nic donohup.out
. (5) Ano, můžete napsat shell skript do smyčky a spustitlsof
, abyste zjistili, zda jenohup.out
stále otevřený. Ale to by byla jiná odpověď. (6) I kdybys to udělal, bylo by to nespolehlivé. Co když nějaký jiný proces otevřel soubornohup.out
? Opravdu byste chtěli zkontrolovat, zda byl tento konkrétní procesnohup.out
otevřen. (7) Pokud to ale uděláte, proč ne jen zkontrolovat, zda proces běží?
Odpovědět
wait
funguje pouze pro podřízený proces spuštěný ve stejném prostředí; je to koneckonců funkce shellu.
Pro jakýkoli libovolný proces na pozadí musíte pracovat s PID. To, co zde nikdo neuvádí, je jádro recyklace PID . Moderní linuxové systémy mohou PID docela znovu použít často záleží na zatížení. Ke spolehlivé identifikaci procesu potřebujete více než jen PID. Jedním z jednoduchých přístupů je úspora času kdy byl proces spuštěn, a pravidelně jej porovnávat s aktuálním časem zahájení procesu. Pokud by měl být PID recyklován, jeho počáteční čas nebude stejný.
Čas zahájení procesu je hlášen jako pole 22 v / proc / [pid] / stat soubor. Čas se měří v jiffies (maximálně 10 ms), což poskytuje dostatek přesnost detekce recyklace ID procesu.
PID=<process ID> START_TIME=$(cut -d " " -f 22 /proc/$PID/stat) while [ "$(cut -d " " -f 22 /proc/$PID/stat 2>/dev/null)" = "$START_TIME" ]; do echo "PROCESS IS RUNNING" sleep 1 done
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;