如何使用 PuTTY 与在 /dev/tty2 上运行的服务交互?

如何使用 PuTTY 与在 /dev/tty2 上运行的服务交互?

好的,我有一个程序(不是我写的,也不能修改),我正在systemdUbuntu 16.04 云服务器上将其作为服务运行。它运行良好,除了我需要能够与正在运行的程序进行交互,而程序支持与其交互的唯一方式是通过stdin/ stdout。我意识到服务仅使用命令行输入是非常不寻常的,但我不知道我还有其他选择。

据我所知这里,可以告诉服务使用 TTYstdinstdout,所以我思考我已经设置了我的服务来执行此操作:

[Unit]
Description=My Service
[email protected]

[Service]
Type=simple
ExecStart=/path/to/my/service
StandardInput=tty
StandardOutput=tty
TTYPath=/dev/tty2
TTYReset=yes
TTYVHangup=yes
Restart=always
RestartSec=5
User=username

[Install]
WantedBy=multi-user.target

一旦我的服务正在运行(是的,它肯定正在运行),我尝试使用screenPuTTY 中的命令来查看,/dev/tty2如中所述这个答案

sudo screen /dev/tty2

但是,当我这样做时,我在 PuTTY 中看到的只是一个空白屏幕,没有任何输出,我无法与之交互。 (是的,该程序在运行时会生成大量输出。)

所以我不确定我哪里出了问题,是服务配置、命令使用screen还是 PuTTY 本身的问题。我一般不是一位经验丰富的 Linux 用户,而且这是我第一次使用 TTY,所以我的理解相当浅薄。

答案1

这尚未经过完全测试,但可能会有效。

登录后(通过 SSH 使用 PuTTY 或其他方式),启动一个新tmux会话(我使用tmux,但您也可以选择screen),就好像您想在其中的 shell 中工作一样。普通命令tmux可以工作,但让我们命名会话:

tmux new-session -s foo

然后找到你的 PID service

pidof service

并将reptyr其连接到您当前的终端tmux(我想您可能sudo也需要)。请参阅我的这个答案了解其简要特点reptyr以及如何使其发挥作用。

reptyr <pid>

如果要退出,请先使用tmux+ Ctrl,B断开连接D(因为screen它是Ctrl+ A, D)。稍后您可以使用以下方式返回该终端

tmux attach-session -t foo

reptyr因此在下次重启之前无需再次使用。


tmux如果我是你,我会首先尝试在里面运行该服务,我希望这会直接将其绑定到tmux无需 TTY 相关systemd设置提供的 TTY。看这个:如何运行tmux/screen并使用systemd> 230?

就像是:


[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/tmux new-session -d -s foo /path/to/my/service
User=username

如果可行,您将必须tmux attach-session …以正确的用户身份运行:

sudo -u username tmux attach-session -t foo

相关内容