PID ของ bash child proccess (imapsync) - คุณจะรับมันได้อย่างไร?


15

ใครสามารถบอกวิธีการรับ PID ของคำสั่งดำเนินการในทุบตี

เช่นฉันมีสคริปต์ทุบตีที่รัน imapsync

เมื่อสคริปต์ถูกฆ่ากระบวนการ imapsync ไม่ได้ถูกฆ่าเสมอดังนั้นฉันต้องการที่จะระบุ PID ของ imapsync โดยทางโปรแกรมจากสคริปต์ของฉันเพื่อที่ฉันจะสามารถฆ่ากระบวนการ imapsync ด้วยตนเองในเครื่องจัดการสัญญาณ

ดังนั้นฉันจะได้รับ PID ของกระบวนการเด็กโดยทางโปรแกรมจากผู้ปกครองสคริปต์ทุบตีได้อย่างไร


1
วิธีการเกี่ยวกับ "pidof imapsync" มีอะไรผิดปกติกับมัน?
pitr

2
ฉันไม่รู้เกี่ยวกับ pidof อย่างไรก็ตามตอนนี้ฉันทำได้แล้วมันไม่ได้มีประโยชน์สำหรับสถานการณ์นี้เท่าที่ฉันสามารถบอกได้เพราะ pidof ดูเหมือนว่าจะส่งคืนคำสั่งที่กำหนดในระบบทั้งหมดถึงแม้จะเป็นของสคริปต์ / ผู้ใช้คนอื่น ๆ ก็ตาม นอกจากนี้ imapsync เป็นสคริปต์ Perl ดังนั้นฉันจะทำ pidof perl ซึ่งน่าจะกลับกระบวนการที่ไม่ใช่ imapsync และอาจเป็นของผู้ใช้รายอื่น
Jason Tan

Javier ถูกต้อง หน้านี้จะนำเสนอข้อมูลเพิ่มเติมเกี่ยวกับProcessManagement
sinping

คำตอบ:


4

imapsync มีตัวเลือกในการตั้งที่เขียน pid:

--pidfile: ไฟล์ที่ imapsync pid ถูกเขียน


FYI นี้ไม่ได้ตอบคำถามของฉันในแง่ทั่วไป แต่ฉันได้ค้นพบ --pidfile arg และมีบาง faffing รอบ ๆ มันก็ดีพอจนถึงตอนนี้ ..
Jason Tan

@JasonTan ทำไมต้องสอนผู้ชายให้ตกปลาเมื่อคุณสามารถให้เขาได้เนื้อก่อนปรุงแสนอร่อยดังนั้นเขาจึงกลับมาและจิกคุณมากขึ้นในวันพรุ่งนี้ใช่มั้ย? ขออภัยที่โพสต์เก่า แต่ทำไมต้องยอมรับคำตอบนี้มากกว่า Javiers?
ไนซ์

46
any_command args &
my_child_PID=$!

IOW เช่นเดียว$$ถือ PID ของคุณ$!มี PID ของคำสั่งพื้นหลังส่วนใหญ่ดำเนินการเมื่อเร็ว ๆ นี้


ขอบคุณ แต่ imapsync นั้นไม่ได้มีพื้นหลังและ $! ไม่ได้ตั้งค่าถ้าฉันสะท้อนในบรรทัดถัดไปหลังจากการเรียกใช้ imapsync หรือบรรทัดแรกของตัวจัดการสัญญาณ :-(
Jason Tan

6
ถ้ามันแยกและทำให้พื้นหลังเด็กเป็นความรับผิดชอบของผู้ปกครองในการบันทึก PID ของเด็กไว้ที่ใดที่หนึ่ง /var/run/whatever.pidการปฏิบัติตามปกติคือการประหยัดมันบางแห่งเช่น อาจมีตัวเลือกบรรทัดคำสั่งเพื่อขอให้บันทึก PID ที่อื่น ถ้าไม่เช่นนั้นฟังดูเหมือนเป็นคุณสมบัติที่จะถามผู้แต่งหรือนำไปใช้เอง
Javier

1
เน้นbackgrounded หากไม่ได้วางกระบวนการไว้ในพื้นหลัง (เช่นต่อท้าย&) แสดงว่า$!ตัวแปรนั้นไม่ได้กำหนดไว้
เทรเวอร์

1
การแก้ปัญหาอื่น ๆ ที่คล้ายกันมีข้อเสนอแนะใน (คำตอบ) วิธีการ pid ของกระบวนการเพิ่งเริ่มต้น ; นอกเหนือจากคำตอบนี้ความเห็นบอกว่า: โอ้และ "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 พ.ย. 53 ที่ 14:28
imz - Ivan Zakharyaschev

10

ซึ่งแตกต่างpidof, pgrepสามารถให้ความหลากหลายของตัวเลือกที่จะ จำกัด ซึ่งกระบวนการก็จะส่งกลับ PIDs สำหรับ สิ่งหนึ่งที่อาจมีประโยชน์อย่างยิ่งคือเลือกตาม PPID โดยใช้ PID ของกระบวนการปัจจุบัน

pgrep -P $$ imapsync

ซึ่งจะส่งออก PIDs ของ imapsync เฉพาะหากพวกเขาเป็นลูกของสคริปต์ของคุณ


0

วิธีการเกี่ยวกับการวาง imapsync ในพื้นหลังชั่วขณะรับ PID แล้วนำหน้ามัน ... บางอย่างเช่นนี้

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