ตรวจสอบคำสั่งปฏิเสธ


10

ฉันออก^z; bg; disownลำดับเพื่ออนุญาตให้ฉันปิดเซสชัน ssh ซึ่งฉันกำลังใช้กระบวนการที่มีความสำคัญยาวนานมาก กระบวนการนี้เขียนเอาต์พุตสถานะไปยัง stderr และยังคงทำเช่นนั้นแม้ว่าจะถูกถอดออก (ตรวจสอบด้วย lsof แล้ว stderr fd จะเปิดขึ้นสำหรับ r / w)

มีวิธีการตรวจสอบว่ากระบวนการนั้นถูกปฏิเสธจริง ๆ หรือไม่ (จะไม่ recv SIGHUP หากเชลล์รับหนึ่ง)


1
ฉันสงสัยว่าสิ่งนี้ต้องไปที่unix.stackexchange.com หรือไม่
Rilindo

2
เพียงแค่อยากรู้ว่าทำไมไม่: $ กระบวนการ 1 >> / root / std.out 2 >> / root / err.out &
Avery Payne

คำตอบ:


12

ใน Bash disownคำสั่งที่ออกด้วยตัวเองจะลบกระบวนการที่ผ่านพื้นหลัง (ผ่านbgหรือ&) ออกจากตารางงานที่ใช้งานอยู่และทำเครื่องหมายว่าไม่ได้รับ SIGHUP เมื่อออกจากระบบ

disown 1 3นอกจากนี้คุณยังสามารถส่งผ่านหนึ่งหรือมากกว่าหนึ่งงานที่จะปฏิเสธเช่น การdisown -hตั้งค่าสถานะมีประโยชน์ถ้าคุณต้องการเก็บงานไว้ในตาราง แต่ก็ยังไม่ได้ SIGHUP เมื่อออกจากระบบ

คุณสามารถดูตารางงานได้โดยออกjobsคำสั่ง หลังจากพื้นหลังสำเร็จจะปรากฏ[1]+ command &ขึ้น หลังจากปฏิเสธงานแล้วไม่ควรแสดงในตารางงานอีกต่อไปและจะไม่ถูกฆ่าเมื่อออกจากระบบอีกต่อไป คุณยังสามารถดูขั้นตอนการผ่านทางps ux, topและสาธารณูปโภคกระบวนการอื่น ๆ ดู

หลังจากงานถูกปฏิเสธคุณสามารถรอให้งานยุติอย่างเป็นธรรมชาติหรือส่งสัญญาณผ่านทางkillPID เพื่อหยุด

เนื่องจาก Bash เพิ่งลบงานออกจากรายการงานที่กำลังดำเนินการเพื่อยกเลิกและไฟล์จัดการกับ stdout ของเทอร์มินัลของคุณและ stderr ยังคงเปิดอยู่คุณจะยังคงได้รับเอาต์พุตจากงานต่อไปจนกว่าอุปกรณ์เทอร์มินัลของคุณจะปิด .

ตัวอย่าง:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

ฉันมักจะใช้เฉพาะdisownเมื่อฉันเรียกใช้คำสั่งที่อาจใช้เวลานานเช่นrsyncหรือcpหลังจากนั้นตัดสินใจว่าฉันจะต้องออกจากระบบโดยไม่ต้องยกเลิกมัน หากคุณรู้ว่าคุณกำลังจะเรียกใช้คำสั่งและออกจากระบบคุณสามารถจับเอาท์พุทโดยการไพพ์หรือteeไอเท็มไปยังไฟล์รันด้วยnohupหรือรันมันในscreen(ซึ่งช่วยให้คุณสามารถเป็นเจ้าของคำสั่ง / ยุติในภายหลัง )

ตัวอย่าง:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null

1
+1 ข้อมูลและตัวอย่าง ดี!
Andy Smith

ความคิดเห็นที่ให้ข้อมูลมาก คุณกำลังบอกว่ามันเป็นไปไม่ได้ที่จะตรวจสอบความไม่แยแสของกระบวนการ (นอกเหนือจากการสังเกตว่ามันไม่มีอยู่ในตารางงาน)?
mikewaters

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