我租用了一台服务器,可以使用 Terminus SSH 终端进行访问。我创建了一个程序,它有提示并接受输入,并且在正常启动时按预期工作。但是我创建了一个服务来在启动时或崩溃时自动启动它,但是当它从该服务启动时,它不会将任何输出打印到终端或接受任何输入。
如果我将单元文件中的Standardinput和Standardoutput留空,并使用systemctl status命令,我可以看到程序启动时应该打印的提示,但我仍然无法给它任何命令。
我尝试将 Standardinput 和 Standardoutput 设置为 tty,并将 tty-force 和 TTYPath 设置为 /dev/pts/0,因为它说这就是我正在使用的 tty。当我这样做时,尽管它仍然不提供任何输出或接受任何输入,并且当我使用 systemctl status 命令时甚至不提供任何启动输出,当我使用 /dev/console 作为 TTYPath 时也是如此,我读到的应该是默认值。所以我不知道为什么当没有设置标准输入或输出时它会在 systemd 状态中显示这些提示,但当它们设置为 /dev/console 时不显示它们(如果这是默认值)。
我还尝试了其他几个 tty,如 ptyp0、ptyp1、tty0、tty2 和 stdin/stdout,但仍然无法使其工作。有什么建议么?
我意识到,如果它在我未连接到 SSH 终端时尝试连接到它,可能会出现问题,如果是这种情况,有没有办法设置一个保持打开状态的虚拟终端并将其用于输入和输出,然后每当我通过 SSH 登录时就连接到该终端?
我将如何通过 SSH 创建虚拟终端并连接到它?我尝试过 chvt 0 和 chvt 1 但得到“无法获取引用控制台的文件描述符。”,也尝试使用 sudo su -,但仍然有相同的响应。
这是单位代码
Description= Makes sure server stays running
[Service]
Type=simple
TTYPath=/dev/pts/0
StandardInput=tty
StandardOutput=tty
ExecStart=/usr/lib/jvm/jdk-19/bin/java -cp /apps/server/lib/*:/apps/server/src packages/Server
Restart=always
RestartSec= 30
[Install]
WantedBy=default.target```
答案1
您可以用于screen
此目的。例如,考虑一个~/noisy.sh
已设为可执行的简单脚本 ( chmod a+x ~/noisy.sh
)。在您的情况下,这将是您长期运行的复杂应用程序。
#!/bin/sh
while :
do
date
sleep 5
done
您可以将其推迟到长时间运行的会话中,如下screen
所示
screen -S myNoisy -md ~/noisy.sh
它-S <session_name>
允许您识别哪个screen
会话是您长时间运行的应用程序。我myNoisy
在例子中使用过。像往常一样,您可以使用 列出会话screen ls
,使用 附加到此会话screen -r myNoisy
,然后使用 再次分离Ctrl Ad。
如果您希望自动重新启动代码,请使用类似我作为替代示例给出的脚本,但在 和 之间插入一行,date
并sleep 5
调用您的实际代码。或者用作screen
在 下启动的应用程序systemd
。