หลายโปรแกรมเช่น sshd สร้างไฟล์. pid ใน / var / run / ที่มี ID กระบวนการของพวกเขา ไฟล์เหล่านี้เชื่อถือได้สำหรับการพิจารณาว่ากระบวนการทำงานอยู่หรือไม่? ฉันเดาว่าไฟล์เหล่านี้สร้างขึ้นเองโดยกระบวนการดังนั้นจะยังคงอยู่ในระบบไฟล์หากโปรแกรมขัดข้อง
หลายโปรแกรมเช่น sshd สร้างไฟล์. pid ใน / var / run / ที่มี ID กระบวนการของพวกเขา ไฟล์เหล่านี้เชื่อถือได้สำหรับการพิจารณาว่ากระบวนการทำงานอยู่หรือไม่? ฉันเดาว่าไฟล์เหล่านี้สร้างขึ้นเองโดยกระบวนการดังนั้นจะยังคงอยู่ในระบบไฟล์หากโปรแกรมขัดข้อง
คำตอบ:
กล่าวอย่างง่าย ๆ ว่าno : กระบวนการ (เช่น daemon) อาจล้มเหลวและไม่มีเวลาล้างไฟล์. pid
เทคนิคที่จะทำให้สถานะของโปรแกรมมีความแน่นอนยิ่งขึ้น: ใช้ช่องทางการสื่อสารที่ชัดเจนเช่นซ็อกเก็ต เขียนพอร์ตซ็อกเก็ตในไฟล์และให้supervisor
กระบวนการค้นหา
คุณยังสามารถใช้บริการของ DBus บน Linux: ลงทะเบียนชื่อเฉพาะและให้กระบวนการหัวหน้างานของคุณ (สิ่งที่คุณเรียกว่า) ตรวจสอบชื่อนั้น
มีเทคนิคมากมาย
สิ่งหนึ่งที่ต้องจำ: มันไม่ได้เป็นความรับผิดชอบของระบบปฏิบัติการในการจัดการไฟล์ PID
Jldupont นั้นถูกต้องในการระบุว่าไฟล์. pid ไม่น่าเชื่อถือสำหรับการพิจารณาว่ากระบวนการกำลังทำงานอยู่หรือไม่เนื่องจากไฟล์อาจไม่ถูกลบในกรณีที่เกิดความผิดพลาด
สภาพการแข่งขันกันฉันมักจะใช้pgrepเมื่อฉันจำเป็นต้องรู้ว่ากระบวนการกำลังทำงานอยู่ ฉันสามารถอ้างอิงข้ามผลลัพธ์กับไฟล์. pid ได้ถ้าฉันรู้สึกว่าจำเป็น
ไฟล์ที่มีรหัสกระบวนการไม่น่าเชื่อถือตรวจสอบว่ากระบวนการทำงานหรือไม่ มันเป็นเพียงแหล่งที่เชื่อถือได้ในการหา id กระบวนการล่าสุดที่ได้รับสำหรับกระบวนการ
เมื่อคุณมี ID กระบวนการคุณต้องทำการตรวจสอบเพิ่มเติมหากกระบวนการนั้นกำลังทำงานอยู่
นี่คือตัวอย่าง:
#!/usr/bin/env sh
file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)
if [ ! -f ${file} ]; then
echo "File does not exists: ${file}"
exit 1
fi
if [ ! -r ${file} ]; then
echo "Insufficient file persmissons: ${file}"
exit 1
fi
psoutput=$(ps -p ${processid} -o comm=)
if [ $? == 0 ];then
if [ ${psoutput} == "sshd" ]; then
echo "sshd process is realy running with process id ${processid}"
exit 0
else
echo "given process id ${processid} is not sshd: ${psoutput}"
exit 1
fi
else
echo "there is no process runing with process id ${processid}"
exit 0
fi
pgrep เป็นคำสั่งที่ดี แต่คุณจะประสบปัญหาเมื่อคุณมีหลายอินสแตนซ์ที่ทำงานอยู่ ตัวอย่างเช่นเมื่อคุณมี sshd ปกติที่ทำงานบนพอร์ต TCP / 22 และคุณมี sshd อื่นที่ทำงานบนพอร์ต TCP / 2222 จากนั้น pgrep จะส่งมอบกระบวนการสองรหัสเมื่อค้นหาsshd ... เมื่อ sshd ปกติมี pid ใน / var /run/sshd.pid และอื่น ๆ อาจมี pid ใน /var/run/sshd-other.pid คุณสามารถแยกความแตกต่างของกระบวนการ
ฉันไม่แนะนำให้ใช้เพียงแค่ps , piping หนึ่งหรือหลายท่อกับgrepและgrep -vพยายามกรองสิ่งอื่น ๆ ทั้งหมดที่ไม่สนใจคุณ ... มันเหมือนกับการใช้
find . | grep myfile
เพื่อคิดออกหากไฟล์ออก
ไม่น่าเชื่อถือเพียงแค่ตรวจสอบการมีอยู่ของกระบวนการด้วย pid เดียวกับที่มีอยู่ในไฟล์
แต่การใช้งาน pidfile จำนวนมากยังทำการล็อกบน pidfile ดังนั้นหากกระบวนการตายไปการล็อกจะหายไป หากกลไกการล็อคมีความน่าเชื่อถือการตรวจสอบเพื่อดูว่าไฟล์ยังคงถูกล็อคเป็นกลไกที่เชื่อถือได้สำหรับการพิจารณาว่ากระบวนการเดิมยังคงทำงานอยู่หรือไม่
Jldupont ถูกต้อง
อย่างไรก็ตามคุณสามารถส่งสัญญาณ 0 กระบวนการ (kill -s 0 pid) เพื่อดูว่ากระบวนการยังมีชีวิตอยู่หรือไม่ (สมมติว่าคุณมีสิทธิ์ในการส่งสัญญาณดังกล่าว - โดยทั่วไปแล้วเจ้าของกระบวนการเท่านั้นที่สามารถส่งสัญญาณได้ มันเป็นสัญญาณ)
ฉันเห็นด้วยกับ jschmier
ในบางระบบคุณไม่สามารถเข้าถึง pgrep ได้ ในกรณีเช่นนี้คุณสามารถทำps -aef | grep <pid>
เพื่อดูว่ากระบวนการทำงานอยู่หรือไม่