เริ่มต้นกระบวนการบน tty อื่น


31

หลังจาก Googling ประมาณหนึ่งชั่วโมงฉันไม่อยากจะเชื่อเลยว่าไม่มีใครถามคำถามนี้มาก่อนเลย ...

ดังนั้นฉันจึงมีสคริปต์ทำงานบน TTY1 ฉันจะทำให้สคริปต์นั้นเปิดตัวโปรแกรมตามอำเภอใจบน TTY2 ได้อย่างไร

  • ฉันพบttyแล้วซึ่งจะบอกคุณว่าคุณกำลังใช้งาน TTY อยู่
  • ฉันพบwritevtซึ่งเขียนข้อความบรรทัดเดียวลงบน TTY อื่น
  • ฉันพบว่าchvtการเปลี่ยนแปลงใดที่ TTY แสดงอยู่ในปัจจุบัน

ฉันไม่ต้องการแสดง TTY2 ฉันต้องการให้สคริปต์หลักดำเนินการตามปกติ แต่ถ้าฉันสลับไปที่ TTY2 ด้วยตนเองฉันสามารถโต้ตอบกับโปรแกรมที่สองได้


จาก TTY1 คุณลองแล้ว[command] > /dev/tty2(คุณต้องลงชื่อเข้าใช้ tty2 แล้ว)?
Pandya

1
นี่อาจเป็น XYproblem ... คุณพยายามทำอะไรให้สำเร็จ เป้าหมายโดยรวมคืออะไร
Olivier Dulac

คำตอบ:


32
setsid sh -c 'exec command <> /dev/tty2 >&0 2>&1'

ตราบใดที่ไม่มีอะไรใช้ TTY ตัวอื่น ( /dev/tty2ในตัวอย่างนี้) สิ่งนี้จะใช้ได้ รวมถึงgettyกระบวนการที่อาจรอให้ใครบางคนเข้าสู่ระบบ การมีมากกว่าหนึ่งกระบวนการที่อ่านอินพุตจาก TTY จะนำไปสู่ผลลัพธ์ที่ไม่คาดคิด

setsid ดูแลการเริ่มต้นคำสั่งในเซสชันใหม่

โปรดทราบว่าcommandจะต้องดูแลการตั้งsttyค่าอย่างถูกต้องเช่นเปิด "โหมดสุก" และonlcrเพื่อให้การขึ้นบรรทัดใหม่จะเพิ่มการขึ้นบรรทัดใหม่กลับคืนเป็นต้น


2
นั่นไม่ถูกต้อง คุณผสมขึ้นสถานีควบคุมด้วย/dev/stdin, และ/dev/stdout แสดงให้เห็นอย่างง่ายดายว่าไม่มีเทอร์มินัลการควบคุมเลยในกรณีของคุณ /dev/stderrpscommand
Hauke ​​Laging

1
@HaukeLaging ผู้นำเซสชันเข้าควบคุมเทอร์มินัลทันทีที่เปิด ปัญหาคือว่าอุปกรณ์ปลายทางไม่ได้เปิดโดยผู้นำเซสชัน ควรได้รับการแก้ไขแล้ว
Stéphane Chazelas

@ StéphaneChazelasฉันทดสอบด้วยsleep 1000และมันยังไม่ทำงานที่นี่ ฉันใช้หลอก tty แม้ว่า (ไม่ควรสร้างความแตกต่างฉันเดา)
Hauke ​​Laging

@HaukeLaging คุณทำยังไงกันแน่? เทอร์มินัลนั้นไม่มีเซสชันการควบคุมอยู่แล้ว ( ตราบใดที่ไม่มีสิ่งอื่นใดที่ใช้ส่วนTTY อื่น ๆ )
Stéphane Chazelas

1
@ StéphaneChazelasฉันวิ่งไปsetsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'ที่หน้าต่างเทอร์มินัลอีมูเลเตอร์ /dev/pts/4เป็นอีกหน้าต่างจำลองเทอร์มินัล (ผู้ใช้เดียวกันกับการbashทำงาน)
Hauke ​​Laging

6

ใน tty ตัวที่สองจะมีโปรแกรมทำงานอยู่โดยปกติจะมีบางโปรแกรมที่ใช้ในการเข้าสู่ระบบหรือบางเชลล์เช่น bash หากคุณต้องการการโต้ตอบคุณจะต้องแทนที่โปรแกรมการเข้าสู่ระบบด้วยของคุณหรือบอกเชลล์เพื่อเรียกใช้โปรแกรมราวกับว่าโปรแกรมเริ่มต้นจาก commandline

วิธีที่ง่ายกว่านั้นคือ IMO คือเริ่มtmuxเซสชันหลังจากเข้าสู่หน้าจอที่สองแล้วใช้:

tmux send yourcommand ENTER

เพื่อเริ่มโปรแกรมในtmuxเซสชันซึ่งจะปรากฏขึ้นหลังจากที่คุณสลับไปยังเทอร์มินัลที่สอง


2

ฉันเพิ่งค้นพบ:

ฉันจะเปิดแอปพลิเคชันจาก 2 ttys เมื่อเปิดใช้งานได้อย่างไร

openvtหนึ่งในการแสดงความคิดเห็นกล่าวถึงสิ่งที่เรียกว่า คำสั่งนี้ดูเหมือนจะทำสิ่งที่แน่นอนฉันหลังจาก!

http://linux.about.com/library/cmd/blcmdl1_openvt.htm

ฉันคิดว่านี่อาจเป็นวิธีที่ "ถูกต้อง" ถ้าไม่มีใครรู้

(ฉันเพิ่งลองและดูเหมือนว่าจะทำงานได้ดี - แม้ว่าgettyจะทำงานอยู่ แต่จะเลือกเทอร์มินัลถัดไปที่ไม่ได้ใช้ฉันเดาว่า VT ไม่ได้รับ "เปิด" จนกว่าคุณจะเปลี่ยนเป็นหนึ่งเพื่อลองลงชื่อเข้าใช้ ... )


0

ฉันเริ่มเซสชันกราฟิกใหม่ใน vt5 ด้วยคำสั่ง follow

xinit "/usr/bin/<binary_executable>" -- :1 vt5

ตัวอย่างเช่น :

xinit "/usr/bin/playonlinux" -- :1 vt5

หากคุณต้องการเปิดแอปพลิเคชันกราฟิกในเซสชันกราฟิกที่ใช้งานอยู่คุณสามารถทำสิ่งต่อไปนี้

DISPLAY=:0 "/usr/bin/playonlinux"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.