การรับ PID ของคำสั่งก่อนหน้านี้ใน Pipeline


11

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

inotifywait -m ... | while read f; do something; done

เนื่องจากinotifywaitไม่ได้ยุติลงเองสคริปต์นี้จะไม่หยุด

ดังนั้นแผนของฉันคือรับ PID ของกระบวนการ inotifywait บันทึกลงในไฟล์และมีกระบวนการอื่นฆ่ามันในภายหลังเช่น:

inotifywait -m ... | { echo ??PID?? > pid-file; while ... }

แต่ฉันไม่รู้วิธีรับ PID มีวิธีง่ายๆในการบรรลุเป้าหมายนี้หรือไม่? อีกวิธีหนึ่งก็คือการบันทึก PID ของเชลล์สคริปต์$$ไปยังไฟล์และฆ่าเชลล์สคริปต์ทั้งหมด แต่ฉันต้องการล้างข้อมูลบางอย่างหลังจากวนลูป

ฉันลองใช้coprocแล้วฉันคิดว่ามันใช้งานได้ แต่ดูเหมือนว่าจะซับซ้อนกว่าที่จำเป็น


คุณสามารถใช้บางสิ่งเช่นนี้ `ps -ef | grep processName | grep -v grep | awk '{พิมพ์ $ 2}' | xargs kill -9 `
Kiwy

@Kiwy - pgrep inotifywaitแทนของระเบียบว่าเพียงแค่ทำ นั่นจะให้ PID ฆ่าpkill inotifwaitคุณ
slm

@slm ขึ้นอยู่กับระบบของคุณคุณจะไม่มี pgrep และ pkill ในขณะที่ grep และ ps ในขณะที่เกือบจะมีอยู่ ไม่เป็นไร
Kiwy

@ Kiwy - สงสัยเครื่องมือเหล่านี้ค่อนข้างแพร่หลาย นอกจากนี้คุณไม่จำเป็นต้องทำgrep -v grepแทนps -ef | grep [p]rocessname...จะทำเช่นเดียวกัน
slm

1
@DavidsonChua - ใช่คุณสามารถใช้-fสวิตช์ได้หากคุณต้องการจับคู่กับชื่อไฟล์เรียกทำงานที่มากขึ้น
slm

คำตอบ:


6

ในไปป์ไลน์กระบวนการทั้งหมดจะเริ่มพร้อมกันไม่มีกระบวนการหนึ่งที่เร็วกว่ากระบวนการอื่น

คุณสามารถทำได้:

(echo "$BASHPID" > pid-file; exec inotifywait -m ...) | while IFS= read -r...

หรือพกพา:

sh -c 'echo "$$" > pid-file; exec inotifywait -m ...' | while IFS= read -r...

โปรดทราบด้วยว่าเมื่อ subshell ที่รันการwhileวนซ้ำinotifywaitจะถูกฆ่าโดยอัตโนมัติในครั้งต่อไปที่มันเขียนอะไรบางอย่างไปยัง stdout



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