ฟังเพื่อออกจากกระบวนการรับ pid $$


16

บอกว่าฉันมี pid อยู่ในมือ mypid=$$

มีคำสั่ง bash / system บ้างที่ฉันสามารถใช้ฟังเพื่อออกจากกระบวนการนั้นด้วย pid ที่กำหนด?

หากไม่มีกระบวนการที่มี mypid อยู่ฉันเดาว่าคำสั่งควรล้มเหลว


ฉันไม่ได้ใช้ C # แต่เห็นได้ชัดว่าต้องมีวิธี: msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx
Alexander Mills

ใน Unix เป็นเรื่องปกติที่จะรอให้กระบวนการลูกใช้waitในเชลล์หรือwait()ฟังก์ชั่นไลบรารี C AFAIK ไม่มีวิธีมาตรฐานในการรอกระบวนการที่ไม่ใช่ลูก ไม่ชัดเจนว่าฟังก์ชัน C # สามารถทำสิ่งนั้นได้หรือไม่ (ขึ้นอยู่กับว่า "กระบวนการที่เกี่ยวข้อง" คืออะไร)
Kusalananda

ฉันสามารถทำได้ด้วยการลงคะแนนเลือกตั้ง แต่นั่นน่ากลัว
Alexander Mills

นอกจากนี้ยังอาจให้ผลลัพธ์ที่ไม่ถูกต้องแก่คุณ การใช้ PID ซ้ำในทางทฤษฎีอาจหมายถึงว่ากระบวนการอาจมีชีวิตด้วย PID เดียวกันกับกระบวนการที่คุณรอ บน Linux (ที่มี PID ตามลำดับ) สิ่งนี้จะไม่เกิดขึ้น แต่บนระบบเช่น OpenBSD (การจัดสรรแบบสุ่ม PID) มันจะเป็นปัญหา
Kusalananda

คำตอบ:


21

ฉันได้สิ่งที่ฉันต้องการจากคำตอบนี้: https://stackoverflow.com/a/41613532/1223975

..turns ออกมาใช้wait <pid> จะทำงานเฉพาะถ้า pid ว่าเป็นกระบวนการที่เด็กของกระบวนการปัจจุบัน

อย่างไรก็ตามสิ่งต่อไปนี้ใช้ได้กับกระบวนการใด ๆ :

เพื่อรอให้กระบวนการใด ๆ เสร็จสิ้น

ลินุกซ์:

tail --pid=$pid -f /dev/null

ดาร์วิน (ต้อง$pidมีไฟล์ที่เปิด):

lsof -p $pid +r 1 &>/dev/null

ด้วยการหมดเวลา (วินาที)

ลินุกซ์:

timeout $timeout tail --pid=$pid -f /dev/null

ดาร์วิน (ต้อง$pidมีไฟล์ที่เปิด):

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

มันไม่เกี่ยวข้องกับ Linux มันเป็นคุณสมบัติของ GNU tail ดังนั้นมันจะทำงานบนระบบใดก็ได้ที่มีหาง GNU เหมือน GNU / Linux และมันจะไม่ทำงานบนระบบที่ไม่ใช่ GNU Linux
Stéphane Chazelas

ฉันกลัวว่าหาง / lsof จะใช้การสำรวจในกรณีนี้อย่างน้อยก็ให้หลักฐานเชิงประจักษ์ที่ปรากฏใน MacOS
Alexander Mills

lsof + r ทำให้มันอยู่ในโหมดเล่นซ้ำดังนั้นคำสั่งนั้นจะทำซ้ำทุก ๆ วินาทีดังนั้นมันจึงใช้การลงคะแนนประณาม
Alexander Mills

3

คุณสามารถใช้ bash builtin ได้wait:

$ sleep 10 &
[2] 28751
$ wait 28751
[2]-  Done                    sleep 10
$ help wait
wait: wait [-n] [id ...]
    Wait for job completion and return exit status.

    Waits for each process identified by an ID, which may be a process ID or a
    job specification, and reports its termination status.  If ID is not
    given, waits for all currently active child processes, and the return
    status is zero.  If ID is a a job specification, waits for all processes
    in that job's pipeline.

    If the -n option is supplied, waits for the next job to terminate and
    returns its exit status.

    Exit Status:
    Returns the status of the last ID; fails if ID is invalid or an invalid
    option is given.

มันใช้ระบบโทรwaitpid()..

$ whatis waitpid
waitpid (2)          - wait for process to change state

ดีที่ใช้งานได้สำหรับฉันหวังว่าจะไม่ใช้การสำรวจภายใต้ประทุนขอบคุณ!
Alexander Mills

1
ใช่จะไม่ทำงานสำหรับกรณีการใช้งานของฉันฉันได้รับข้อผิดพลาดนี้: bash: wait: pid 47760 is not a child of this shell... กลับไปที่กระดานวาดรูปฮ่า ๆ
อเล็กซานเดมิลส์

ฉันมีคำตอบฉันเพิ่งโพสต์ไว้ขอบคุณ
Alexander Mills

2
สิ่งนี้จะรอให้กระบวนการลูกไม่ใช่กระบวนการที่ไม่เกี่ยวข้องกับกระบวนการปัจจุบัน
Kusalananda

1

เกี่ยวกับhttps://stackoverflow.com/a/41613532/1223975แก้ปัญหาที่อเล็กซานเดมิลส์โพสต์ใหม่Timeout in Seconds Darwinเป็นวิธีแก้ปัญหาสำหรับ UNIX เหมือนระบบปฏิบัติการที่ไม่ได้มี tailGNU ไม่เฉพาะเจาะจงDarwinแต่ขึ้นอยู่กับอายุของระบบปฏิบัติการที่คล้าย UNIX บรรทัดคำสั่งที่นำเสนอมีความซับซ้อนเกินความจำเป็นและอาจล้มเหลว:

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

บน UNIX เก่าอย่างน้อยหนึ่งlsofอาร์กิวเมนต์จะ+r 1m%sล้มเหลว (แม้สำหรับ superuser):

lsof: can't read kernel name list.

m%sเป็นข้อกำหนดรูปแบบการออก โพสต์โปรเซสเซอร์ที่เรียบง่ายไม่จำเป็นต้องใช้ ตัวอย่างเช่นคำสั่งต่อไปนี้รอบน PID 5959 นานถึงห้าวินาที:

lsof -p 5959 +r 1 | awk '/^=/ { if (T++ >= 5) { exit 1 } }'

ในตัวอย่างนี้ถ้า PID 5959 ออกจากสอดคล้องของตัวเองก่อนที่ห้าวินาทีผ่านไปเป็น${?} 0ถ้าไม่${?}กลับมา1หลังจากห้าวินาที

นอกจากนี้ยังอาจจะมีมูลค่า noting ชัดแจ้งในที่+r 1นี้1เป็นช่วงโพล (วินาที) ดังนั้นจึงอาจมีการเปลี่ยนแปลงเพื่อให้เหมาะกับสถานการณ์

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