ฉันกำลังเขียนสคริปต์ Perl ที่แยกวิเคราะห์ logfiles เพื่อรวบรวม PID แล้วตรวจสอบว่า PID นั้นทำงานอยู่หรือไม่ ฉันพยายามคิดวิธีที่ดีที่สุดในการตรวจสอบ เห็นได้ชัดว่าฉันสามารถทำสิ่งที่ชอบ:
system("ps $pid > /dev/null") && print "Not running\n";
อย่างไรก็ตามฉันต้องการหลีกเลี่ยงการเรียกระบบถ้าเป็นไปได้ ฉันจึงคิดว่าฉันสามารถใช้/proc
ระบบไฟล์ได้ (ความสะดวกในการพกพาไม่ใช่เรื่องที่น่ากังวลนี่จะทำงานบนระบบ Linux เสมอ) ตัวอย่างเช่น:
if(! -d "/proc/$pid"){
print "Not running\n";
}
ปลอดภัยไหม ฉันสามารถเดาได้หรือไม่ว่าหากไม่มี/proc/$pid/
ไดเรกทอรี PID ที่เกี่ยวข้องไม่ทำงานอยู่ ฉันคาดหวังเช่นนั้นเนื่องจาก AFAIK ps
เองได้รับข้อมูลจากตัวเอง/proc
แต่เนื่องจากเป็นรหัสการผลิตฉันจึงต้องการให้แน่ใจ
ดังนั้นจะมีกรณีที่กระบวนการทำงานไม่มี/proc/PID
ไดเรกทอรีหรือมี/proc/PID
ไดเรกทอรีอยู่และกระบวนการไม่ทำงานหรือไม่ มีเหตุผลใดที่ต้องการแยกวิเคราะห์ps
มากกว่าการตรวจสอบการมีอยู่ของไดเรกทอรีหรือไม่?
kill -0
เป็นวิธีที่ดีที่สุด) นี่จะบอกคุณว่ามีกระบวนการกำลังทำงานที่มี PID ที่กำหนดหรือไม่ ไม่ได้บอกคุณว่ากระบวนการจะยังคงทำงานต่อไปหนึ่งมิลลิวินาทีหรือไม่และไม่ได้บอกคุณว่ากระบวนการนั้นเป็นกระบวนการที่คุณสนใจหรือกระบวนการที่ไม่เกี่ยวข้องซึ่งกำหนด PID เดียวกันหลังจากกระบวนการที่น่าสนใจตาย . มันเกือบจะผิดพลาดในการทดสอบว่า PID ที่กำหนดกำลังทำงานอยู่หรือไม่ : มีบางสถานการณ์ที่ไม่ได้เกิดจากสภาพการแข่งขัน
kill
ฟังก์ชั่นPerl โดยใช้สัญญาณ 0 ซึ่งไม่ฆ่า แต่บอกว่าคุณสามารถทำได้ (เช่นคุณต้องได้รับอนุญาตในการส่งสัญญาณกระบวนการนั้น)