ไฟล์. pid เชื่อถือได้สำหรับการพิจารณาว่ากระบวนการกำลังทำงานอยู่หรือไม่


11

หลายโปรแกรมเช่น sshd สร้างไฟล์. pid ใน / var / run / ที่มี ID กระบวนการของพวกเขา ไฟล์เหล่านี้เชื่อถือได้สำหรับการพิจารณาว่ากระบวนการทำงานอยู่หรือไม่? ฉันเดาว่าไฟล์เหล่านี้สร้างขึ้นเองโดยกระบวนการดังนั้นจะยังคงอยู่ในระบบไฟล์หากโปรแกรมขัดข้อง

คำตอบ:


16

กล่าวอย่างง่าย ๆ ว่าno : กระบวนการ (เช่น daemon) อาจล้มเหลวและไม่มีเวลาล้างไฟล์. pid

เทคนิคที่จะทำให้สถานะของโปรแกรมมีความแน่นอนยิ่งขึ้น: ใช้ช่องทางการสื่อสารที่ชัดเจนเช่นซ็อกเก็ต เขียนพอร์ตซ็อกเก็ตในไฟล์และให้supervisorกระบวนการค้นหา

คุณยังสามารถใช้บริการของ DBus บน Linux: ลงทะเบียนชื่อเฉพาะและให้กระบวนการหัวหน้างานของคุณ (สิ่งที่คุณเรียกว่า) ตรวจสอบชื่อนั้น

มีเทคนิคมากมาย

สิ่งหนึ่งที่ต้องจำ: มันไม่ได้เป็นความรับผิดชอบของระบบปฏิบัติการในการจัดการไฟล์ PID


1
การมีอยู่ของไฟล์ pid รวมกับกระบวนการที่มีอยู่อย่างไรก็ตามควรมีเพียงพอ หากกระบวนการเลิกแล้วคุณสามารถตรวจสอบได้ PID จะถูกนำกลับมาใช้ใหม่ แต่ไม่บ่อยนัก
MarkR

2
ความถี่ที่ pid ถูกนำกลับมาใช้ใหม่จะขึ้นอยู่กับระบบเฉพาะที่เป็นปัญหา ฉันเคยเห็นระบบที่ถูก PID กรณือย่างน้อยทุกวัน คุณต้องตรวจสอบ pid ว่ามีกระบวนการและกระบวนการนั้นดูเหมือนจะเป็นกระบวนการที่คุณคาดว่าจะเป็นเจ้าของ pid

@ atk: แน่นอน ไม่มีมาตรฐานต่อ se และแม้ว่าจะมีสิ่งหนึ่งมันก็ไม่ได้รับความเคารพจากการใช้งานบางอย่าง เช่นฉันสามารถสร้างภูตที่ไม่เขียนไฟล์ PID เลยและใช้ back channel เพื่อรับคำสั่งการจัดการ
jldupont

@ atk: น่าเสียดายที่ไม่มีวิธีที่จะทำให้แน่ใจว่า PID จะไม่ถูกนำมาใช้ซ้ำระหว่างเวลาของการตรวจสอบและเวลาที่ใช้ ...
SamB

3

Jldupont นั้นถูกต้องในการระบุว่าไฟล์. pid ไม่น่าเชื่อถือสำหรับการพิจารณาว่ากระบวนการกำลังทำงานอยู่หรือไม่เนื่องจากไฟล์อาจไม่ถูกลบในกรณีที่เกิดความผิดพลาด

สภาพการแข่งขันกันฉันมักจะใช้pgrepเมื่อฉันจำเป็นต้องรู้ว่ากระบวนการกำลังทำงานอยู่ ฉันสามารถอ้างอิงข้ามผลลัพธ์กับไฟล์. pid ได้ถ้าฉันรู้สึกว่าจำเป็น


3

ไฟล์ที่มีรหัสกระบวนการไม่น่าเชื่อถือตรวจสอบว่ากระบวนการทำงานหรือไม่ มันเป็นเพียงแหล่งที่เชื่อถือได้ในการหา 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

เพื่อคิดออกหากไฟล์ออก


2

ไม่น่าเชื่อถือเพียงแค่ตรวจสอบการมีอยู่ของกระบวนการด้วย pid เดียวกับที่มีอยู่ในไฟล์

แต่การใช้งาน pidfile จำนวนมากยังทำการล็อกบน pidfile ดังนั้นหากกระบวนการตายไปการล็อกจะหายไป หากกลไกการล็อคมีความน่าเชื่อถือการตรวจสอบเพื่อดูว่าไฟล์ยังคงถูกล็อคเป็นกลไกที่เชื่อถือได้สำหรับการพิจารณาว่ากระบวนการเดิมยังคงทำงานอยู่หรือไม่


1

Jldupont ถูกต้อง

อย่างไรก็ตามคุณสามารถส่งสัญญาณ 0 กระบวนการ (kill -s 0 pid) เพื่อดูว่ากระบวนการยังมีชีวิตอยู่หรือไม่ (สมมติว่าคุณมีสิทธิ์ในการส่งสัญญาณดังกล่าว - โดยทั่วไปแล้วเจ้าของกระบวนการเท่านั้นที่สามารถส่งสัญญาณได้ มันเป็นสัญญาณ)


4
แต่การตรวจสอบการมีอยู่ของกระบวนการด้วย PID นั้นไม่ได้หมายความว่าเป็น PID ที่คุณสนใจ
janm

0

ฉันเห็นด้วยกับ jschmier

ในบางระบบคุณไม่สามารถเข้าถึง pgrep ได้ ในกรณีเช่นนี้คุณสามารถทำps -aef | grep <pid>เพื่อดูว่ากระบวนการทำงานอยู่หรือไม่


1
จุดสำคัญในคำถามคือ "เชื่อถือได้" การทำ ps และค้นหา PID นั้นไม่น่าเชื่อถือ
janm

อืม ... สมมติว่าคุณรู้ชื่อของโปรแกรมทำไมคุณถึงคิดว่า ps -aef | grep ไม่น่าเชื่อถือ?
user29584

3
สภาพการแข่งขัน: สถานะของระบบมีการเปลี่ยนแปลงตามเวลา ps สิ้นสุดลง ชื่อกระบวนการ: กระบวนการอื่นอาจมีชื่อคล้ายกับชื่อที่คุณสนใจหลายอินสแตนซ์: พิจารณาระบบที่มีบริการเดียวกันสองอินสแตนซ์โดยแต่ละไฟล์ PID หนึ่งล้มเหลวและอื่น ๆ เริ่มต้นใหม่และได้รับ PID ของบริการแรก คุณบอกได้อย่างไร ฯลฯ ไม่น่าเชื่อถือเป็นไปไม่ได้ที่จะได้รับสิทธิเนื่องจากสภาพการแข่งขันและมีเทคนิคที่เชื่อถือได้ที่เพิ่งทำงาน สำหรับทางเลือกที่เชื่อถือได้ดูตัวอย่างเช่นcr.yp.to/daemontools.html
janm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.