วิธีรับสถานะการออกจากกระบวนการจากเชลล์เซสชั่นอื่น


7

bash -c 'apt-get update && apt-get upgrade'สมมติว่าผมใช้คำสั่งในเซสชั่นเปลือกหนึ่งเช่น 5 นาทีต่อมาฉันตัดสินใจที่จะออกไปข้างนอกเพื่อหาของว่างและตระหนักว่าฉันลืมที่จะเพิ่มกลไกการแจ้งเตือนบางรูปแบบไม่ว่าทางออกจะสำเร็จหรือล้มเหลว

ตอนนี้ฉันจะทำอะไรดี ถ้ามีเพียงฉันเท่านั้นที่สามารถสืบค้นสถานะการออกจากเทอร์มินัลอื่นจากคำสั่งอื่น (หรือโดยเฉพาะ PID นั้น) ฉันอาจทำได้หลังจากแสดงป๊อปอัปทั้งหมด ดังนั้นคำถามคือฉันจะค้นหาสถานะทางออกของกระบวนการที่กำลังทำงานอยู่จากเทอร์มินัลอื่นได้อย่างไร

ในคำอื่น ๆ

ได้รับว่าฉันมีกระบวนการทำงานใน terminal A และ PID ของมันเป็นที่รู้จักกัน

เมื่อฉันรันคำสั่งบางอย่างในเทอร์มินัล B

จากนั้นฉันควรจะรู้ว่ากระบวนการในเทอร์มินัล A เสร็จสิ้นด้วยสถานะออก 0 หรือสถานะออก> 1


ดังนั้นคุณต้องการบางสิ่ง (คำสั่งการแจ้งเตือนที่รายงานรหัสการออกหรือไม่) เพื่อเรียกใช้เมื่อกระบวนการ A (PID ที่กำหนด) ถูกระบุยุติลงหลังจากติด "ผู้เฝ้าดู" เข้ากับคำสั่ง B หรือไม่ เราไม่สามารถสรุปได้ว่า A เป็นงานพื้นหลังที่ทำงานในเชลล์เดียวกันซึ่งคุณพิมพ์ B ในภายหลังหรือไม่?
ผู้บัญชาการไบต์

@ByteCommander ถูกต้อง มันเป็นงานที่สำคัญ
Sergiy Kolodyazhnyy

ฉันไม่คิดว่าเป็นไปได้ที่จะได้รับรหัสส่งคืนจากชายด์ของเชลล์ที่แตกต่างกัน คุณสามารถใช้waitเพื่อรับรหัสของกระบวนการพื้นหลังในเชลล์ปัจจุบันของคุณหลังจากที่มันสิ้นสุดลง แต่ฉันไม่พบสิ่งใดที่จะอนุญาตให้สอบถามเชลล์อื่น ๆ เพียงแค่ตรวจสอบว่ากระบวนการยังทำงานอยู่หรือไม่และเพิ่มการแจ้งเตือนเมื่อออกมาก็ไม่สำคัญอีกครั้ง แต่ไม่พบรหัสทางออก วิธีเดียวที่ฉันอาจคิดว่าจะต้องเตรียมเชลล์ของคุณPROMPT_COMMANDเพื่อเก็บรหัสทางออกสุดท้ายใน tempfile หรือตำแหน่งที่สามารถเข้าถึงได้ที่คล้ายกัน นั่นจะเป็นตัวเลือกหรือไม่?
ผู้บัญชาการไบต์

@ByteCommander Nope ไม่มีการเตรียมเทอร์มินัล A ทำทุกอย่างจากเทอร์มินัลบีและเชื่อใจฉันเป็นไปได้
Sergiy Kolodyazhnyy

1
มันจะเป็นการเตรียมการอย่างถาวร (แก้ไข. bashrc หนึ่งครั้ง) แต่ก็โอเค มองไปข้างหน้าเพื่ออ่านคำตอบหากคุณพบคำตอบ
ผู้บัญชาการ Byte

คำตอบ:


8

ใช้straceดังต่อไปนี้:

sudo strace -e trace=none -e signal=none -q -p $PID

ทั้งระบบสายสัญญาณมิได้เป็นที่สนใจของที่นี่ดังนั้นเราบอกstraceจะไม่สนใจพวกเขาด้วยการแสดงออกและการปราบปรามข้อความสถานะกับ-e แนบกับกระบวนการด้วย PID รอให้กระบวนการออกตามปกติและส่งออกสถานะการออกเช่นนี้:-qstrace$PID

+++ exited with 0 +++

ifนิพจน์อย่างง่ายในการโทรการแจ้งเตือนประเภทใด ๆ อาจเป็น:

if sudo strace -e trace=none -e signal=none -q -p $PID |& grep -q ' 0 '; then
  echo yeah
else
  echo nope
fi

ตัวอย่างการวิ่ง

# in terminal 1
$ (echo $BASHPID;sleep 10;true)
8807
# in terminal 2
$ if sudo strace -e{trace,signal}=none -qp8807|&grep -q ' 0 ';then echo yeah;else echo nope;fi
yeah

# in terminal 1
$ (echo $BASHPID;sleep 10;false)
12285
# in terminal 2
$ if sudo strace -e{trace,signal}=none -qp12285|&grep -q ' 0 ';then echo yeah;else echo nope;fi
nope

เครดิตส่วนใหญ่ไปที่คำตอบนี้ใน U&Lโปรดออกจากการโหวตถ้าคุณพบว่ามีประโยชน์

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