nohup ระยะไกลหลังจากความจริงกับ tcsh


11

ฉันมีอินสแตนซ์ tcsh ใน xterm ที่ใช้กระบวนการระยะยาว (สัปดาห์) เซิร์ฟเวอร์ Xvnc ที่กำลังทำงานภายใต้วัชพืชออกไป มันใช้ CPU 100% และไม่ตอบสนอง (นี่เป็นข้อผิดพลาดที่รู้จักและฉันรู้ว่ามันไม่สามารถกู้คืนได้)

กระบวนการระยะยาวกำลังปิดกั้น stdout อยู่

มีวิธีใดบ้างที่ฉันสามารถฆ่าโพรเซสต้นแบบ - tcsh, xterm, อะไรก็ได้ - และทำให้โปรเซสระยะยาวทำงานต่อไป?

(โปรดไม่มีคำตอบเกี่ยวกับscreenฉันรู้ว่ามันไม่ใช่กระบวนการของฉันมันเป็นของผู้ใช้พวกเขาจะไม่เรียนรู้)

คำตอบ:


17

โพสต์นี้อาจช่วย คำแนะนำคือ:

  1. พื้นหลังกระบวนการ (ด้วย Ctrl-Z จากนั้นbg )
  2. เรียกใช้disown -h% [jobid] (น่าจะเป็น bash-ism ดังนั้นคุณจะต้องแปลสำหรับ tcsh)

ข่าวร้ายของหลักสูตรคือว่าBGจะต้องมีการทำในเปลือกเดียวกันกระบวนการทำงานใน ... แต่ ... มันอาจอยู่แล้วจะ backgrounded

ข่าวร้ายจริงๆก็คือการปฏิเสธการเรียกร้องอาจจำเป็นที่จะต้องทำในเปลือกเดียวกัน ในกรณีนี้ใช่คุณกำลังเมา แต่ฉันไม่แน่ใจว่าอาจจะทำให้รูตปลดการเชื่อมต่อได้

อืมมม ข่าวดีที่เป็นไปได้- tcsh ทำการปฏิเสธโดยอัตโนมัติ:

หากออกจาก tcsh ผิดปกติมันจะปฏิเสธงานที่กำลังทำงานอยู่ในพื้นหลังโดยอัตโนมัติเมื่อออก

ดังนั้นหากกระบวนการระยะยาวของคุณมีพื้นหลังแล้วการฆ่าผู้ปกครอง tcsh ควรอนุญาตให้ดำเนินการต่อ กระบวนการถูกยกเลิกการเชื่อมต่อจากเทอร์มินัลเริ่มต้น (หากไม่ใช่โปรดดู "ข่าวร้าย" ด้านบน)

น่าเสียดายที่มันไม่ใช่หน้าจอดังนั้นจึงไม่มีการเชื่อมต่อจริง คุณสามารถปลอมด้วย gdb อาจ (อีกครั้งจากลิงค์แรก):

[... ] กับแฮ็กสกปรกบางอย่างมันเป็นไปไม่ได้ที่จะเปิดกระบวนการ 'stdout / stderr / stdin อีกครั้ง

ดังนั้นคุณยังสามารถสร้างหน้าต่างหน้าจอว่างเปล่า (เช่นอินสแตนซ์ที่ทำงาน)

จากนั้นใช้ gdb เพื่อแนบกับกระบวนการให้ทำการโทรปิด (0)
ปิดการโทร (1)
ปิดการโทร (2)
เปิดการโทร ("/ dev / pts / xx", ... )
โทรซ้ำ (0)
โทร dup (0)
detach

ผลลัพธ์ของกระบวนการจะไปที่หน้าจอ มันจะไม่ติดกับหน้าจอเทอร์มินัลดังนั้นตัวอย่างเช่น [sic] จะฆ่าคำสั่ง "sleep" ไม่ใช่กระบวนการ แต่อาจเพียงพอสำหรับ OP

ฉันสงสัยว่าไม่ควรมี "call dup (1)" และ "call dup (2)" ในกระบวนการนั้นด้วย ...


ใช่มันเป็นกระบวนการพื้นหน้าดังนั้นฉันเดาว่าฉันเมาแล้ว
wfaulk

ใช่. แต่อย่างที่คุณพูดมันไม่ใช่กระบวนการของคุณไม่ใช่ความผิดของคุณ ขอโทษที่คุณติดอยู่กับความยุ่งเหยิง
ต้มตุ๋น Quixote

2
ทั้งหมดนี้เพียงช่วยชีวิตฉันไว้ ฉันพบปัญหาเดียวกันกับที่ฉันโพสต์เกี่ยวกับตอนแรกซึ่งเป็นกระบวนการที่ถูกบล็อกบน STDOUT เมื่อเซิร์ฟเวอร์ X (และฉันเดาว่า xterm ระหว่างนั้น) ได้รับการแก้ไข ปรากฎว่าฉันไม่จำเป็นต้องทำอะไรนอกจากปิด STDOUT ผลลัพธ์นั้นไม่เกี่ยวข้อง ข้อมูลจริงอยู่ในล็อกไฟล์บางแห่ง ดังนั้นฉันจึงสามารถแนบกับ gdb เรียกใช้ "โทรปิด (1)" แล้ว "ต่อ" และมันก็ย้ายไปอีกครั้ง ขอบคุณมาก!
wfaulk

ฮะ! น่าสนใจ ที่ทำให้ทุกอย่างละลาย ความแปลกประหลาด ดีใจที่มันช่วยสรรพสินค้าใหญ่!
ต้มตุ๋น Quixote

2
อาจเป็นการชี้ให้เห็นว่าการส่ง "Ctrl-Z" ไปยังกระบวนการพื้นหน้าและการส่ง SIGSTOP ไปยัง pid นั้นเป็นสิ่งเดียวกัน (SIGCONT จะเริ่มต้นขั้นตอนการกลับมาอีกครั้ง.) ฉันไม่ทราบว่านี้จะเป็นประโยชน์สำหรับคนอื่น ๆ ในสถานการณ์เดียวกันหรือไม่ แต่ในการทดสอบอย่างรวดเร็วของฉันส่ง SIGSTOP ตาม SIGCONT ซ้ำกัน "Ctrl-Z" bgตามด้วย
wfaulk

3

คำถามเหล่านี้อ้างถึงโปรแกรมที่ชื่อว่า Cryopid ซึ่งอาจช่วยคุณได้ อย่างไรก็ตามฉันไม่มีประสบการณ์ใด ๆ กับมัน

การย้ายกระบวนการระหว่างโฮสต์

การย้าย xterms ระหว่างเซสชัน X

Nohup และกลั่นกรองกระบวนการ


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