好的,我有一个程序(不是我写的,也不能修改),我正在systemd
Ubuntu 16.04 云服务器上将其作为服务运行。它运行良好,除了我需要能够与正在运行的程序进行交互,而程序支持与其交互的唯一方式是通过stdin
/ stdout
。我意识到服务仅使用命令行输入是非常不寻常的,但我不知道我还有其他选择。
据我所知这里,可以告诉服务使用 TTYstdin
和stdout
,所以我思考我已经设置了我的服务来执行此操作:
[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
一旦我的服务正在运行(是的,它肯定正在运行),我尝试使用screen
PuTTY 中的命令来查看,/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