在其他tty上启动进程


31

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

因此,我在TTY1上运行了一个脚本。如何使该脚本在TTY2上启动任意程序?

  • 我发现tty,它告诉您当前正在使用哪个TTY。
  • 我发现writevt,它将单行文本写入不同的TTY。
  • 我发现chvt,它更改了当前显示的TTY。

我不想显示 TTY2。我只希望主脚本继续正常执行,但是如果我手动切换到TTY2,则可以与第二个程序进行交互。


在TTY1中,您是否尝试过[command] > /dev/tty2(必须已经登录tty2)?
潘迪2014年

1
这可能是一个XY问题...您要达到什么目的?总体目标是什么?
Olivier Dulac 2014年

Answers:


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

只要没有其他东西正在使用另一个TTY(/dev/tty2在此示例中),这应该起作用。这包括getty可能正在等待某人登录的过程。如果有多个进程从TTY读取其输入,则会导致意外结果。

setsid 负责在新会话中启动命令。

请注意,command必须注意stty正确设置设置,例如打开“ cooked mode”,onlcr以便输出换行符将添加回车等。


2
那是不对的。你混淆了与控制终端/dev/stdin/dev/stdout/dev/stderrps轻松表明command您的情况根本没有控制终端。
Hauke Laging

1
@HaukeLaging,会话负责人在打开终端后立即对其进行控制。问题是会话主持人未打开终端设备。现在应该修复。
斯特凡Chazelas

我测试过的@StéphaneChazelas,sleep 1000在这里仍然无法使用。不过,我使用了一个伪tty(我想这不会有所作为)。
Hauke Laging

@HaukeLaging你到底是怎么做到的?该终端是否没有控制会话(只要没有其他设备正在使用其他TTY部分)?
斯特凡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之类的shell。如果要进行交互,则要么必须用您的登录程序替换登录程序,要么告诉shell运行该程序,就像从命令行启动该程序一样。

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

tmux send yourcommand ENTER

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


2

我刚刚发现:

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

其中一条评论提到了一个叫的东西openvt。这个命令似乎完全可以满足我的要求!

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

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

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


0

我使用以下命令在vt5上启动新的图形会话

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

例如 :

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

如果要在已经处于活动状态的图形会话上启动图形应用程序,可以使用:

DISPLAY=:0 "/usr/bin/playonlinux"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.