Bir arka plan işlemi başlatmak ve ne zaman biteceğini kontrol etmek


40

Arka planda bir işlemi nasıl başlatabilirim ve bir bash betiğinde ne zaman biteceğini nasıl kontrol edebilirim? Benim fikrim böyle bir senaryo:

launch backgroundprocess &
while [ Process is running ];do
   echo "PROCESS IS RUNNING\r"
done;

echo "PROCESS TERMINATED"

Yanıtlar:


66

Anahtar "wait" komutudur:

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"


2
Bunun dezavantajı, kullanıcı için ilerleme göstermek gibi, beklerken başka hiçbir şey yapamamanızdır. Sadece cuonglm'un çözümü bunu yapmanıza izin veriyor.
Mark Booth

3
@Mark Booth Üçüncü bir asenkron iş ile ilerlemeyi belirtebilirsiniz. örneğin:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell

32

İle waitsen ayrıntı düzeyini olabilir İhtiyacınız:

sleep 1 &
PID1=$!
sleep 2 &
PID2=$!

wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'

29

İşte bunu yapmanın bir yolu:

launch backgroundprocess &
PROC_ID=$!

while kill -0 "$PROC_ID" >/dev/null 2>&1; do
    echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
exit 0

2
Teşekkürler, bu kesinlikle orijinal soru hakkındaki yorumuma cevap veren tek cevaptır (ve bu soruya
Mark Booth

@ cuonglm, Birden fazla işlem nedir? Muhtemelen waitbunun için daha uygun?
Nishant

@cuonglm komutunu öldürmek için -0 seçeneği ne yapar
k_vishwanath

1
@k_vishwanath, işlemin hala devam edip etmediğini bildirir.
cuonglm

0

İşleminizi nohup ile çalıştırabilir ve nohup'un günlüğe kaydettiği nohup.out dosyasını okumak için kabuk betiği yazabilirsiniz.

  nohup command &

4
(1) Tüyleri bölme riski altında nohupolanlara hiçbir şey yazmaz nohup.out; yalnızca dosyayı oluşturur ve komutun çıktısını ona yeniden yönlendirir. (2) Komut herhangi bir çıktı üretmezse, hiçbir şey yazılmaz nohup.outve bu fikir hiçbir yere hızlı gitmez. (3) commandYazma çıktısı olsa bile , çıktının izlenmesiyle ne zaman biteceğini nasıl söyleyebilirsiniz?
G-Man

@ G-Man belki hala kullanıp kullanmadığını lsofgörmek için çıktıyı kontrol ederek , ancak bunun çok kıllı bir yöntem olduğunu kabul ediyorum. nohupnohup.out
Alexej Magura

(4) Zaman commandçalışmaya başladığında nohup, gitti. (1) Evet, bir sayıyı tekrarlıyorum, çünkü iki yıl önce söylediklerimi tekrarlıyorum: nohuphiçbir şey yazmıyor nohup.out. (5) Evet, hala açık lsofolup olmadığını görmek için döngü ve çalıştırma için bir kabuk betiği yazabilirsiniz nohup.out. Ancak bu farklı bir cevap olurdu. (6) Bunu yapsanız bile, güvenilmez olacaktır. Ya başka bir işlem nohup.outdosyayı açtıysa? Bu sürecin nohup.outaçık olup olmadığını gerçekten kontrol etmek istersiniz . (7) Ancak, bunu yapacaksanız, neden sadece sürecin çalışıp çalışmadığını kontrol etmiyorsunuz?
G-Man
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.