ฉันได้แยกกระบวนการออกจากเทอร์มินัลของฉันเช่นนี้
$ process &
เทอร์มินัลนั้นปิดตัวไปนาน แต่process
ยังคงทำงานอยู่และฉันต้องการส่งคำสั่งบางอย่างไปยัง stdin ของกระบวนการนั้น เป็นไปได้ไหม
ฉันได้แยกกระบวนการออกจากเทอร์มินัลของฉันเช่นนี้
$ process &
เทอร์มินัลนั้นปิดตัวไปนาน แต่process
ยังคงทำงานอยู่และฉันต้องการส่งคำสั่งบางอย่างไปยัง stdin ของกระบวนการนั้น เป็นไปได้ไหม
คำตอบ:
ใช่แล้ว. mkfifo /tmp/fifo
ขั้นแรกให้สร้างท่อ:
ใช้ gdb เพื่อแนบกับกระบวนการ:
gdb -p PID
แล้วปิด stdin: call close (0)
; และเปิดอีกครั้ง:call open ("/tmp/fifo", 0600)
ในที่สุดให้เขียน (จากเทอร์มินัลอื่นเนื่องจาก gdb อาจค้าง):
echo blah > /tmp/fifo
touch /tmp/thefile
สร้างไฟล์มากกว่าท่อ stdout เป็น 1 ดังนั้นcall close (1)
; call open ("/tmp/thefile", 0400)
นอกจากนี้ยังใช้สิทธิ์ที่ถูกต้องสำหรับการเขียน: echo…
มีแน่นอนไม่จำเป็น
call open("/tmp/fifo", 0600)
แต่น่าเสียดายที่มันก็ดูเหมือนจะแขวนบน ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก
เมื่อเทอร์มินัลดั้งเดิมไม่สามารถเข้าถึงได้อีกต่อไป ...
reptyr
อาจเป็นสิ่งที่คุณต้องการดูhttps://serverfault.com/a/284795/187998
อ้างจากที่นั่น:
ดูreptyrซึ่งทำอย่างนั้น หน้า GitHub มีข้อมูลทั้งหมดreptyr - เครื่องมือสำหรับโปรแกรม "re-ptying"
reptyr เป็นยูทิลิตี้สำหรับการเรียกใช้โปรแกรมที่มีอยู่และแนบไปกับเทอร์มินัลใหม่ เริ่มกระบวนการที่ใช้เวลานานกว่า ssh แต่ต้องออกและไม่ต้องการขัดจังหวะหรือไม่ เพียงแค่เริ่มต้นหน้าจอใช้ reptyr เพื่อคว้ามันแล้วฆ่าเซสชัน ssh และมุ่งหน้ากลับบ้าน
การใช้งาน
reptyr PID
"reptyr PID" จะจับกระบวนการด้วย id PID และแนบกับเทอร์มินัลปัจจุบันของคุณ
หลังจากติดตั้งแล้วกระบวนการจะรับอินพุตจากและเขียนเอาต์พุตไปยังเทอร์มินัลใหม่รวมถึง ^ C และ ^ Z (น่าเสียดายถ้าคุณใช้มันคุณจะต้องเรียกใช้ "bg" หรือ "fg" ในเทอร์มินัลเก่าซึ่งเป็นไปไม่ได้ที่จะแก้ไขด้วยวิธีที่เหมาะสมโดยไม่ต้องทำการแก้ไขเชลล์)
ฉันค่อนข้างแน่ใจว่าคุณไม่สามารถ
ps x
ตรวจสอบการใช้ หากกระบวนการที่มีความ?
เป็นควบคุม TTYคุณไม่สามารถส่งเข้ากับมันมาก ๆ
9942 ? S 0:00 tail -F /var/log/messages
9947 pts/1 S 0:00 tail -F /var/log/messages
ในตัวอย่างนี้คุณสามารถส่งป้อนข้อมูลเพื่อทำสิ่งที่ต้องการ9947
echo "test" > /dev/pts/1
กระบวนการอื่น ( 9942
) ไม่สามารถเข้าถึงได้
ครั้งต่อไปคุณสามารถใช้หน้าจอหรือtmuxเพื่อหลีกเลี่ยงสถานการณ์นี้
echo "test" > /dev/pts/1
นั้นจะไม่ส่งอินพุตไปยังกระบวนการ9947
- มันจะเอาท์พุทคำว่า "ทดสอบ" บนเทอร์มินัลของกระบวนการนั้น
แก้ไข : ดังที่ Stephane Gimenez กล่าวว่าไม่ใช่เรื่องง่าย มันอนุญาตให้คุณพิมพ์ไปยังเทอร์มินัลอื่นเท่านั้น
คุณสามารถพยายามที่จะเขียนถึงขั้นตอนนี้ใช้proc / มันควรจะอยู่ใน/ proc / pid / fd / 0ดังนั้นง่าย:
echo "hello" > /proc/PID/fd/0
ควรทำมัน ฉันยังไม่ได้ลอง แต่ควรใช้งานได้ตราบใดที่กระบวนการนี้ยังมีไฟล์อธิบายstdin ที่ถูกต้อง คุณสามารถตรวจสอบกับls -l
ใน/ proc / pid / FD /
ดูnohupสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีทำให้กระบวนการทำงานต่อไป
echo
บางอย่างไปยังอุปกรณ์เทอร์มินัลจะพิมพ์สิ่งที่คุณเขียนบนเทอร์มินัลมันจะไม่ถูกส่งไปยังกระบวนการ
เพียงแค่จบบรรทัดคำสั่งด้วย&
จะไม่แยกกระบวนการมันจะทำงานในพื้นหลัง (ด้วยzsh
คุณสามารถใช้&!
เพื่อแยกออกจริงมิฉะนั้นคุณจะทำในdisown
ภายหลัง)
เมื่อกระบวนการทำงานในเบื้องหลังมันจะไม่ได้รับอินพุตจากเทอร์มินัลการควบคุมอีกต่อไป แต่คุณสามารถส่งมันกลับมาที่เบื้องหน้าด้วยfg
แล้วมันจะอ่านอินพุตอีกครั้ง
ไม่เช่นนั้นคุณจะไม่สามารถเปลี่ยนไฟล์ภายนอกที่บันทึกไว้ (รวมถึง stdin) หรือเชื่อมต่อสถานีควบคุมที่สูญหายไปอีกครั้ง ... เว้นแต่คุณจะใช้เครื่องมือดีบั๊ก (ดูคำตอบของ Ansgarหรือดูretty
คำสั่ง)
>>/dev/stderr
อื่นเมื่อฉันปิดเทอร์มินัลกระบวนการ "ที่ถูกปฏิเสธ" จะสิ้นสุดเช่นกัน .. ฉันไม่เคยเข้าใจสิ่งนี้เลย ..