在不同的 tty 上启动进程

在不同的 tty 上启动进程

经过大约一个小时的谷歌搜索后,我无法相信之前实际上没有人问过这个问题......

所以我有一个在 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

我刚刚有了一个发现:

如何在启动时从 2 个 tty 启动应用程序?

其中一条评论提到了一种叫做openvt.这个命令似乎做的正是我想要的事情!

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

除非有人知道不同,否则我认为可能是执行此操作的“正确”方法。

(我刚刚尝试过,它似乎工作正常 - 即使getty正在运行,它也会选择下一个未使用的终端。我猜 VT 不会“打开”,直到您切换到一个尝试登录...)

答案4

在不同的 tty 上启动 bash:

setsid agetty --autologin root  --noclear 19200 ttyS1 linux

相关内容