Spusťte proces na pozadí a zkontrolujte, kdy končí

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

  • Výhodou tohoto postupu: NEPÁLÍ CPU čas s nekonečnou smyčkou běžící pořád ….;)
  • Nevýhodou toho je, že během čekání ' nemůžete dělat nic jiného , jako je indikace pokroku uživateli. Toto vám umožňuje pouze cuonglm ' řešení .
  • @Mark Booth Můžete označují průběh třetí asynchronní úlohy. např .: cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;

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 do nohup.out; pouze vytvoří soubor a přesměruje na něj výstup příkazu. (2) Pokud příkaz ' t neprodukuje žádný výstup, do nohup.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, zda nohup 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 do nohup.out. (5) Ano, můžete napsat shell skript do smyčky a spustit lsof, abyste zjistili, zda je nohup.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 soubor nohup.out? Opravdu byste chtěli zkontrolovat, zda byl tento konkrétní proces nohup.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 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *