经过大约一个小时的谷歌搜索后,我无法相信之前实际上没有人问过这个问题......
所以我有一个在 TTY1 上运行的脚本。如何让该脚本在 TTY2 上启动某个任意程序?
- 我发现
tty
,它告诉您当前正在使用哪个 TTY。 - 我发现
writevt
,它将一行文本写入到不同的 TTY 上。 - 我发现
chvt
,这会更改当前显示的 TTY。
我不想展示TTY2。我只希望主脚本继续正常执行,但如果我手动切换到 TTY2,我可以与第二个程序交互。
答案1
setsid sh -c 'exec command <> /dev/tty2 >&0 2>&1'
只要没有其他东西使用其他 TTY(/dev/tty2
在本例中),这应该可以工作。这包括一个getty
可能正在等待某人登录的进程;有多个进程从 TTY 读取其输入将要导致意想不到的结果。
setsid
负责在新会话中启动命令。
请注意,command
必须注意stty
正确设置设置,例如打开“煮熟模式”,onlcr
以便输出换行符将添加回车符等。
答案2
在第二个 tty 上通常会运行一个程序,要么是某个登录程序,要么是某个 shell(如 bash)。如果您想要交互,您要么必须用您的程序替换登录程序,要么告诉 shell 运行该程序,就好像该程序是从命令行启动的一样。
在我看来,一个更简单的解决方案是tmux
在登录第二个屏幕后启动会话,然后使用:
tmux send yourcommand ENTER
tmux
在切换到第二个终端后将显示的会话中启动程序。
答案3
我刚刚有了一个发现:
其中一条评论提到了一种叫做openvt
.这个命令似乎做的正是我想要的事情!
http://linux.about.com/library/cmd/blcmdl1_openvt.htm
除非有人知道不同,否则我认为这可能是执行此操作的“正确”方法。
(我刚刚尝试过,它似乎工作正常 - 即使getty
正在运行,它也会选择下一个未使用的终端。我猜 VT 不会“打开”,直到您切换到一个尝试登录...)
答案4
在不同的 tty 上启动 bash:
setsid agetty --autologin root --noclear 19200 ttyS1 linux