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