Luncurkan proses latar belakang dan periksa kapan itu berakhir


41

Bagaimana saya bisa meluncurkan proses di latar belakang dan memeriksa kapan itu berakhir dalam skrip bash? Ide saya adalah skrip seperti ini:

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

echo "PROCESS TERMINATED"

Jawaban:


68

Kuncinya adalah perintah "tunggu":

#!/bin/bash

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

7
Manfaat ini: TIDAK membakar waktu CPU dengan loop tak terbatas yang berjalan sepanjang waktu ....;)
Pascal Schmiel

2
Kerugiannya adalah Anda tidak dapat melakukan hal lain saat menunggu, seperti menunjukkan kemajuan kepada pengguna. Hanya solusi cuonglm yang memungkinkan Anda melakukan ini.
Mark Booth

3
@Mark Booth Anda dapat menunjukkan kemajuan dengan pekerjaan asinkron ketiga. misal:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell

32

Dengan waitAnda dapat memiliki rincian yang Anda butuhkan:

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

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

29

Inilah salah satu cara untuk melakukannya:

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
Terima kasih, ini jelas satu-satunya jawaban yang menjawab penafsiran saya tentang pertanyaan asli (dan alasan mengapa saya akhirnya melihat pertanyaan ini)
Mark Booth

@cuonglm, Apakah ada beberapa proses? Mungkin waitlebih cocok untuk itu?
Nishant

@cuonglm apa -0 opsi untuk membunuh perintah lakukan
k_vishwanath

1
@k_vishwanath melaporkan apakah proses masih berjalan atau tidak.
cuonglm

0

Anda dapat menjalankan proses Anda dengan nohup dan menulis skrip shell untuk membaca file nohup.out yang digunakan nohup untuk login.

  nohup command &

4
(1) Dengan risiko rambut rontok, nohuptidak menulis apa pun untuk nohup.out; itu hanya membuat file, dan mengarahkan output dari perintah itu. (2) Jika perintah tidak menghasilkan keluaran apa pun, tidak ada yang akan ditulis nohup.out, dan gagasan ini tidak berjalan dengan cepat. (3) Sekalipun commandmenulis output, bagaimana Anda bisa tahu kapan output berakhir dengan memonitor output itu?
G-Man Mengatakan 'Reinstate Monica'

@ G-Man mungkin dengan memeriksa output lsofuntuk melihat apakah nohupmasih menggunakan nohup.out, tapi saya setuju ini adalah metode yang sangat berbulu.
Alexej Magura

(4) Pada saat commandmulai berjalan, nohuphilang. (1) Ya, saya mengulangi angka, karena saya mengulangi apa yang saya katakan dua tahun lalu: nohuptidak menulis apa pun nohup.out. (5) Ya, Anda bisa menulis skrip shell untuk diulang dan dijalankan lsofuntuk melihat apakah nohup.outmasih terbuka. Tetapi itu akan menjadi jawaban yang berbeda. (6) Bahkan jika Anda melakukan itu, itu tidak dapat diandalkan. Bagaimana jika beberapa proses lain membuka nohup.outfile? Anda benar-benar ingin memeriksa apakah proses khusus ini nohup.outterbuka. (7) Tetapi, jika Anda akan melakukannya, mengapa tidak memeriksa saja apakah prosesnya berjalan?
G-Man Mengatakan 'Reinstate Monica'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.