วิธีการเปลี่ยนเส้นทางการส่งออกของกระบวนการทำงาน?


11

ฉันรู้วิธีการเปลี่ยนเส้นทางการส่งออกและวิธีการปราบปรามพวกเขาในทุบตี ตอนนี้คิดว่าฉันไม่ได้ตั้งใจลืมที่จะผนวกเป็นส่วนหนึ่งของการเปลี่ยนเส้นทางส่งออกไปยังคำสั่ง (เช่น2>&1หรือ> /tmp/mystdout) และขั้นตอนการพื้นหลังของฉันทำงานอยู่แล้วในขณะที่ผมยังสามารถเปลี่ยนที่stdoutและstderrมีการเขียนไปยัง? ฉันไม่ต้องการฆ่าและรีสตาร์ทแอปพลิเคชันจริงๆ

หากต้องการระบุเฉพาะเจาะจงมากขึ้นตามที่Gillesถามในความคิดเห็นของเขาฉันต้องการทำเรื่องนี้ในสถานการณ์เฉพาะเหล่านี้:

  • ไฟล์เอาต์พุตไม่ถูกต้อง
  • ลืมเปลี่ยนเส้นทางstderrไปที่stdout

หรือทั้งสองอย่างรวมกัน

เช่นฉันมี Apache ทำงานและฉันสามารถดูไฟล์อธิบาย:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

เปลี่ยนเป็นเทอร์มินัลอื่นหรือไม่ หรือไฟล์? หากคุณพอใจกับการเชื่อมต่อกับเทอร์มินัลปัจจุบันหรือเซสชันหน้าจอใหม่ให้ดูที่ฉันจะปฏิเสธกระบวนการทำงานและเชื่อมโยงกับเชลล์หน้าจอใหม่ได้อย่างไร
Gilles 'หยุดชั่วร้าย'

คำตอบ:


8

คุณสามารถทำได้โดยใช้ reredirect ( https://github.com/jerome-pouiller/reredirect/ )

reredirect -m /dev/null <PID>

คุณสามารถกู้คืนเอาต์พุตเริ่มต้นของกระบวนการของคุณได้ในภายหลังโดยใช้สิ่งต่อไปนี้:

reredirect -N -O <M> -E <N> <PID>

( <M>และ<N>ให้บริการโดยการเปิดตัว reredirect ก่อนหน้านี้)

reredirect READMEยังอธิบายวิธีเปลี่ยนเส้นทางไปยังคำสั่งอื่นหรือเปลี่ยนเส้นทางเฉพาะ stdout หรือ stderr


3

มันเป็นไปไม่ได้. หรืออย่างน้อยก็ไม่ใช่เรื่องง่าย คุณอาจมีโชคติด gdb กับกระบวนการและเล่นซอกับ gdb แต่อาจนำไปสู่การล่มได้ง่ายเช่นเดียวกับความสำเร็จ



รู้สึกอิสระที่จะแบ่งปันให้ฉันจะ upvote คำตอบ :)
เดนนิส Kaarsemaker

อืมผมทำอยู่แล้ว
Gilles 'SO- หยุดความชั่วร้าย'

1
ไม่มาก เครื่องมือทั้งหมดที่เชื่อมโยงในข้อผิดพลาดอื่น ๆ นั้นเกี่ยวกับการเชื่อมต่อกับเทอร์มินัล / หน้าจออื่น ไม่เกี่ยวกับการเปลี่ยนเส้นทางไปยังไฟล์อื่น แม้ว่าอาจไม่ยากที่จะแก้ไข reptyr เพื่อเปลี่ยนเส้นทางไปยังไฟล์แทน
Dennis Kaarsemaker

ฉันดูเล็กน้อยในแหล่งที่มาของ reptyr และฉันเห็นด้วยมากที่สุดกับส่วน "ไม่ง่าย" ของคำตอบ อาจใช้เวลาดำน้ำลึกในภายหลัง
gertvdijk

2

คุณควรใช้reptyrเพื่อแนบกระบวนการอื่นเข้ากับเทอร์มินัลปัจจุบันของคุณ ตัวอย่างเช่น: ติดตั้งและใช้ GNU ของscreenยูทิลิตี้และในนั้นเปิดreptyrคำสั่ง "ดึง" เปลี่ยนเส้นทางกระบวนการอื่น ๆ (และควบคุม Terminal) และแนบไปยังสถานีปัจจุบันใหม่ (คนscreenกระบวนการถ้าคุณเปิดตัวreptyrจากscreen) ข้อดีของการทำสิ่งนี้จากscreenเซสชันคือเมื่ออยู่ภายใต้screenมันจะง่ายต่อการยกเลิกการเชื่อมต่อและเชื่อมต่อใหม่ (ตัวอย่างเช่นปิดเซสชันท้องถิ่นของคุณกลับบ้านและเปิดใหม่)


ขอบคุณสำหรับคำตอบของคุณ แต่มันไม่ได้ช่วยฉันในกรณีของฉันเพราะฉันไม่ได้ถามเกี่ยวกับการถอดขั้ว / retach โปรดอ่านคำถามของฉันอีกครั้งและตัวอย่างเฉพาะ
gertvdijk

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