Bash: ตรวจสอบว่ากระบวนการหยุดทำงาน


1

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

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

นี่คือสิ่งที่ฉันมี:

pkill -f "stuff"

for i in {1..30}; do
    VERIFICATIONS=$i
    if verification_command then
        echo "It's gone"
        break
    fi
    sleep 2
done

if [ $VERIFICATIONS -ge 30 ]; then
   echo "failed to terminate"
   # send mail
fi

มีวิธีที่ดีกว่าในการทำเช่นนี้?


คุณดูรหัสส่งคืนหรือไม่
napcae

คำตอบ:


0

ฉันไม่แน่ใจว่าส่วนไหนที่คุณต้องการปรับปรุง สำหรับการฆ่ากระบวนการจำนวนมากเก็บ pid ของตนเอง (= Process id) ในไดเรกทอรี / var / run ในไฟล์นามสกุล. pid ซึ่งมีเฉพาะ pid เท่านั้นไม่มีอะไรอื่น

pid นี้ใช้โดยโปรแกรมเพื่อฆ่าตัวตาย (ฆ่าตัวตาย?) หากโปรแกรมเริ่มต้นใหม่ (สาเหตุที่ทำให้โปรแกรมไม่สามารถฆ่าโปรแกรมได้) pid ใหม่จะแตกต่างจากโปรแกรมเดิม ทั้งหมดนี้ใช้กับบริการโดยเฉพาะเช่นโปรแกรมที่คุณสามารถหยุดได้

 sudo service sshd stop

(ใน Debian และอนุพันธ์) คุณอาจลองใช้กลไกที่คล้ายกัน


0

พบสิ่งที่ฉันเชื่อว่าเป็นวิธีที่ดีที่สุดตามความคิดเห็นของ napcae : ใช้ฟังก์ชั่น

assert_service_stopped () {
    for i in {1..30}; do
        if verification_command then
            echo "It's gone"
            return 0
        fi
        sleep 2
    done
    echo "It hangs dude!"
    return 1
}        

pkill -f "stuff"

if ! assert_service_stopped; then
    echo "failed to terminate"
    # send mail
fi

นี่เป็นข้อดีของการอนุญาตให้มีการยืนยันจำนวนมากได้อย่างง่ายดายและเมื่อไม่มีการดำเนินการที่ต้องการ (เช่นการส่งอีเมล) การยืนยันสามารถทำได้ครั้งสุดท้ายและสถานะการออกจากสคริปต์จะแสดงผลลัพธ์การยืนยัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.