แจ้งการเปลี่ยนแปลงไฟล์ภายใต้ / proc


13

ฉันเขียน 'daemon' ขนาดเล็กใน bash ที่จะเปลี่ยนเป็นหูฟังหากตรวจพบและหากไม่ได้เปลี่ยนเป็นลำโพง USB ภายนอกด้วย PulseAudio

สิ่งที่ฉันกำลังมองหาคือวิธีการรับการแจ้งเตือนการเปลี่ยนแปลงในไฟล์/proc/asound/card0/codec#0เช่นเดียวinotifywaitกับในไฟล์จริง (พิจารณาไฟล์ภายใต้ / proc เป็น "pseudo-files")

ฉันพบรหัสของฉันบิตบ้าเพราะมันทำงานsleep 1กับawkทั้งวันนั่นคือ 86400 ครั้งต่อวัน :)

while sleep 1; do
    _1=${_2:-}
    _2=$(awk '/Pin-ctls/{n++;if(n==4)print}' '/proc/asound/card0/codec#0')

    [[ ${_1:-} = $_2 ]] ||
        if [[ $_2 =~ OUT ]]; then
            use_speakers
        else
            use_internal
        fi
done

สิ่งที่ฉันกำลังมองหาคือสิ่งที่ต้องการ (ตัวอย่างนี้ไม่ทำงาน):

codec=/proc/asound/card0/codec#0
while inotifywait $codec; do
    if [[ $(awk '/Pin-ctls/{n++;if(n==4)print}' $codec) =~ OUT ]]; then
        use_speakers
    else
        use_internal
    fi
done

วิธีนี้คำสั่งภายในลูปจะทำงานเฉพาะเมื่อมีการเปลี่ยนแปลงจริงใน$codecไฟล์


1
มันไม่ได้บ้า - สิ่งที่ชอบtopและจอภาพระบบ GUI อ่านมากกว่าทั้งหมดจาก/procช่วงเวลาสั้น ๆ แน่นอนว่าพวกเขาอาจทำมันได้อย่างมีประสิทธิภาพมากขึ้นเช่นเดียวกับไฟล์ประมวลผลที่คอมไพล์ แต่ประเด็นคือ: การสำรวจข้อมูลเป็นงานทั่วไป
goldilocks

2
เนื่องจากปัญหาพื้นฐานไม่ได้มีลักษณะเฉพาะสำหรับคุณฉันคาดว่าจะมีโซลูชันสำเร็จรูป (อย่างน้อยสำหรับฮาร์ดแวร์บางตัว) - ดูที่unix.stackexchange.com/questions/25776/และsuperuser.com/questions / 339900 / … . แหล่งที่ดีที่สุดคือแน่นอนเคอร์เนลทรี (และรายละเอียดฮาร์ดแวร์ถ้าคุณตัดสินใจที่จะใช้มันในไดรเวอร์บางตัว)
เตอร์

1
หากสิ่งนี้ปรากฏขึ้น/procคุณอาจเรียกสคริปต์ของคุณด้วยกฎudevซึ่งน่าจะเหมาะอย่างยิ่ง น้อยเหมาะเป็นวิธีการที่น่าเบื่อที่จะสามารถขึ้นมาพร้อมกับกฎ udev;)
Goldilocks

@ peterph จากสิ่งที่ฉันสามารถรวบรวมได้ hda-verb จัดเตรียมอินเทอร์เฟซสำหรับการตั้งค่าหรือตรวจสอบพารามิเตอร์ แต่ดูเหมือนว่าฉันจะต้องเรียกใช้ทุกวินาทีเช่นกัน
Teresa e Junior

@goldilocks การเสียบหูฟังจะไม่ส่ง udev-event ใด ๆ หรือมีอะไรอีกมากมายที่ฉันขาดหายไป
Teresa e Junior

คำตอบ:


10

สิ่งที่ฉันกำลังมองหาเป็นวิธีที่จะได้รับการแจ้งเตือนการเปลี่ยนแปลงในไฟล์ [ใน proc]

คุณทำไม่ได้เพราะไม่ใช่ไฟล์ นี่ไม่ใช่คำถามที่ซ้ำกัน แต่คำตอบที่นี่จะอธิบายว่าทำไม

/procเป็นส่วนต่อประสานเคอร์เนล ไม่มีไฟล์จริงที่นั่นจึงไม่สามารถเปลี่ยนแปลงได้ การอ่านจากที่จับเป็นการร้องขอและข้อมูลในไฟล์เมื่อคุณอ่านเป็นการตอบกลับ

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

หากคุณstatprocfs ไฟล์ atime และ mtime จะเหมือนกัน: สำหรับบางไฟล์มันเป็นทุกครั้งที่มีการเรียกใช้ stat สำหรับคนอื่น ๆ เวลาจากในระหว่างการบูตระบบ ในกรณีแรกดูเหมือนว่าจะมีการเปลี่ยนแปลงเสมอในครั้งที่สองดูเหมือนว่าจะไม่มีการเปลี่ยนแปลง


น่าเสียดายที่ถึงแม้จะทำการสำรวจทุก ๆ วินาทีจะเพิ่มความหน่วงแฝง (เช่น 500ms) ฉันหวังว่าจะมีวิธีที่เร็วขึ้น / มีประสิทธิภาพมากขึ้นในการทำเช่นนี้ แต่เนื่องจากคุณได้กล่าวถึงว่าแอพยอดนิยมทำในลักษณะเดียวกันฉันคิดว่าฉันจะปล่อยให้เป็นเช่นนั้น
Teresa e Junior

@TeresaeJunior หากความล่าช้าเป็นปัญหา (ฉันคิดว่ามันไม่ได้อยู่ที่นี่) เช่นเนื่องจากระยะเวลาของการสำรวจความคิดเห็นถูกนำมาใช้ในการคำนวณคุณจะกำหนดเวลาตามระยะเวลาที่แท้จริง (ไม่ใช่แค่ใช้เวลาที่คุณขอให้หลับ) . ดูเหมือนว่าจะมาก ฉันไม่เคยทุบตีสคริปต์ทุบตีดังนั้นฉันไม่รู้ว่าอะไรจะเป็นเรื่องปกติที่นี่ (อืม ... คำถามแยกต่างหากที่ดี) การเรียกใช้ awk == fork()และสิ่งที่มีราคาแพง โปรแกรมอรรถประโยชน์ที่เขียนทั้งหมดใน C จะมีวิธีที่เร็วกว่า ฉันยังไม่คิดว่าคุณกำลังเพิ่มภาระให้กับระบบโดยรวม
goldilocks

1
ไม่ขอโทษจริง ๆ แล้วฉันหมายถึง: ตั้งแต่เวลาที่ฉันเสียบหูฟังจนกระทั่งการนอนหลับครั้งต่อไปมีความล่าช้าที่เห็นได้ชัด แต่ฉันไม่ได้วางแผนที่จะลดเวลาการนอนหลับ ขอบคุณสำหรับความช่วยเหลือของคุณ!
Teresa e Junior

4

หากคุณใช้ PulseAudio ให้pactl subscribeทำสิ่งนี้


ใช่แน่นอน! ฉันเริ่มใช้มันหลังจากรวบรวม PA 4.0 เมื่อหลายเดือนก่อนเนื่องจากปัญหาเรื่องเสียง เวอร์ชันของ Debian Stable คือ 2.0 (แม้ว่าจะอัปโหลด 4.0 ไปยัง backport เมื่อเร็ว ๆ นี้) และไม่มีsubscribeบน 2.0
Teresa e Junior

2

นอกจากนี้โปรดทราบว่าไฟล์บางไฟล์ที่อยู่ภายใต้การ/proc/อนุญาตให้ตรวจสอบการเปลี่ยนแปลงผ่านการทำโพลเช่นหากman procคุณสามารถอ่านข้อมูลเกี่ยวกับ/proc/self/mountsไฟล์ต่อไปนี้:

/ proc / [pid] / mounts (ตั้งแต่ Linux 2.4.19) ไฟล์นี้แสดงรายการระบบไฟล์ทั้งหมดที่ติดตั้งอยู่ในเมาท์เนมสเปซของกระบวนการ (ดูที่ mount_namespaces (7)) รูปแบบของไฟล์นี้มีการบันทึกไว้ใน fstab (5)

เนื่องจากเคอร์เนลเวอร์ชัน 2.6.15 ไฟล์นี้มีมลภาวะ: หลังจากเปิดไฟล์สำหรับการอ่านการเปลี่ยนแปลงในไฟล์นี้ (เช่นการเมานต์ระบบไฟล์หรือยกเลิกการเมานต์) ทำให้เลือก (2) เพื่อทำเครื่องหมายไฟล์ descriptor ว่ามีเงื่อนไขพิเศษและ แบบสำรวจ (2) และ epoll_wait (2) ทำเครื่องหมายไฟล์ว่ามีเหตุการณ์สำคัญ (POLLPRI) (ก่อน Linux 2.6.30 การเปลี่ยนแปลงในไฟล์นี้ถูกระบุโดยตัวอธิบายไฟล์ที่ถูกทำเครื่องหมายว่าสามารถอ่านได้สำหรับเลือก (2) และถูกทำเครื่องหมายว่ามีเงื่อนไขข้อผิดพลาดสำหรับการสำรวจความคิดเห็น (2) และ epoll_wait (2))

และนั่นคือสิ่งที่ถูกนำไปใช้ในคำถามต่อไปนี้:

/programming/5070801/monitoring-mount-point-changes-via-proc-mounts


-1

ลองใช้netlinkเพื่อตรวจสอบ/procไฟล์ที่เปลี่ยนไป

https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/


ยินดีต้อนรับสู่เว็บไซต์ โปรดเพิ่มคำอธิบายเกี่ยวกับวิธีใช้netlinkเพื่อให้งานสำเร็จ; ไม่ชัดเจนจากเนื้อหาภายนอกที่คุณเชื่อมโยง นอกจากนี้ยังเป็นที่ต้องการโดยทั่วไปที่จะไม่มีคำตอบแบบ "ลิงก์อย่างเดียว" เนื่องจากเนื้อหาภายนอกอาจเปลี่ยนแปลงหรือถูกลบออก (ดูประกาศด้านบนของหน้าลิงก์เดิมของคุณเป็นต้น) ซึ่งจะลดประโยชน์ของการบริจาคของคุณ
AdminBee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.