在不同的 tty 上启动进程

Mat*_*hid 37 bash tty

在谷歌搜索了大约一个小时后,我不敢相信之前没有人真正问过这个问题......

所以我有一个在 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以便输出换行符会添加回车等。

  • 那是不正确的。你将控制终端与 `/dev/stdin`、`/dev/stdout` 和 `/dev/stderr` 混为一谈。`ps` 很容易表明在你的情况下 `command` 根本没有控制终端。 (3认同)

Ant*_*hon 6

在第二个 tty 上,通常会有一个程序在运行,要么是一些登录程序,要么是一些像 bash 这样的 shell。如果您想要交互,您要么必须用您的登录程序替换登录程序,要么告诉 shell 运行该程序,就像该程序是从命令行启动的一样。

一个更简单的解决方案,IMO,是tmux在登录第二个屏幕后启动一个会话,然后使用:

tmux send yourcommand ENTER
Run Code Online (Sandbox Code Playgroud)

tmux切换到第二个终端后显示的会话中启动程序。


Mat*_*hid 6

我刚刚有了一个发现:

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

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

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

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

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