ฉันได้แยกกระบวนการออกจากเทอร์มินัลของฉันเช่นนี้
$ 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อื่นเมื่อฉันปิดเทอร์มินัลกระบวนการ "ที่ถูกปฏิเสธ" จะสิ้นสุดเช่นกัน .. ฉันไม่เคยเข้าใจสิ่งนี้เลย ..