เรียกใช้กระบวนการพื้นหลังและตรวจสอบเมื่อมันสิ้นสุด


40

ฉันจะเริ่มกระบวนการในพื้นหลังและตรวจสอบเมื่อมันสิ้นสุดภายในสคริปต์ทุบตีได้อย่างไร ความคิดของฉันคือสคริปต์เช่นนี้:

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

echo "PROCESS TERMINATED"

คำตอบ:


66

กุญแจสำคัญคือคำสั่ง "รอ":

#!/bin/bash

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

7
ประโยชน์ของสิ่งนี้: มันไม่ได้เผาเวลา CPU ด้วยวงวนไม่สิ้นสุดที่รันตลอดเวลา .... ;)
Pascal Schmiel

2
ข้อเสียของการทำเช่นนี้คือคุณไม่สามารถทำอะไรได้อีกในขณะที่คุณรอเช่นแสดงความคืบหน้าให้กับผู้ใช้ โซลูชันของ cuonglmเท่านั้นที่อนุญาตให้คุณทำเช่นนี้ได้
Mark Booth

3
@Mark Booth คุณสามารถระบุความคืบหน้าด้วยงานอะซิงโครนัสที่สาม เช่น:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell

32

ด้วยwaitคุณสามารถมีความละเอียดที่คุณต้องการ:

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

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

29

นี่เป็นวิธีหนึ่งในการทำ:

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
ขอบคุณคำตอบนี้เป็นคำตอบเดียวที่ตอบคำถามของฉัน (และเหตุผลที่ทำให้ฉันดูคำถามนี้)
Mark Booth

@cuonglm มีหลายกระบวนการอะไรบ้าง? อาจwaitเหมาะสมกว่าสำหรับสิ่งนั้นหรือ
Nishant

@cuonglm ตัวเลือก -0 ในการฆ่า command ทำอะไร
k_vishwanath

1
@k_vishwanath รายงานว่ากระบวนการยังทำงานอยู่หรือไม่
cuonglm

0

คุณสามารถรันกระบวนการของคุณด้วย nohup และเขียนเชลล์สคริปต์เพื่ออ่านไฟล์ nohup.out ซึ่ง nohup ใช้ในการเข้าสู่ระบบ

  nohup command &

4
(1) ที่เสี่ยงต่อการขนแยกที่nohupไม่ได้เขียนอะไรที่จะnohup.out; มันเพียงสร้างไฟล์และเปลี่ยนเส้นทางเอาต์พุตของคำสั่งไปยังมัน (2) หากคำสั่งไม่สร้างผลลัพธ์ใด ๆ จะไม่มีการเขียนข้อมูลใด ๆnohup.outและความคิดนี้จะไปอย่างรวดเร็ว (3) แม้ว่าcommandจะเขียนเอาท์พุทคุณจะบอกได้อย่างไรว่ามันจะจบลงเมื่อไหร่ด้วยการมอนิเตอร์เอาต์พุตนั้น
G-Man กล่าวว่า 'Reinstate Monica'

@ G-Man โดยการตรวจสอบผลลัพธ์ของlsofเพื่อดูว่าnohupยังใช้อยู่nohup.outหรือไม่ แต่ฉันยอมรับว่านี่เป็นวิธีที่มีขนดกมาก
Alexej Magura

(4) เมื่อเวลาcommandเริ่มทำงานnohupจะหายไป (1) ใช่ฉันกำลังทำซ้ำตัวเลขเพราะฉันทำซ้ำสิ่งที่ฉันพูดเมื่อสองปีที่แล้ว: nohupไม่ได้เขียนอะไรnohup.outเลย (5) ใช่คุณสามารถเขียนเชลล์สคริปต์เพื่อวนซ้ำและรันlsofเพื่อดูว่าnohup.outยังเปิดอยู่หรือไม่ แต่นั่นจะเป็นคำตอบที่แตกต่าง (6) แม้ว่าคุณจะทำเช่นนั้นมันก็จะไม่น่าเชื่อถือ เกิดอะไรขึ้นถ้ากระบวนการอื่นเปิดnohup.outไฟล์? คุณต้องการตรวจสอบว่ากระบวนการเฉพาะนี้nohup.outเปิดขึ้นจริงหรือไม่ (7) แต่ถ้าคุณจะทำอย่างนั้นทำไมไม่ลองตรวจสอบดูว่ากระบวนการกำลังทำงานอยู่หรือไม่?
G-Man กล่าวว่า 'Reinstate Monica'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.