【发布时间】:2017-09-05 22:22:11
【问题描述】:
如何为使用屏幕的 Java 应用程序设置 systemd 服务,并且仍然能够重新连接到该屏幕?我已经搜索了高低的答案,并尝试了几种不同的方法,但我认为 systemd 正在将扳手扔进整个事情中。
我有一个 Java 应用程序设置为在 systemd 中作为服务运行。它使用 Screen,因为我需要在它运行后能够以交互方式使用它。它在没有 GUI 的 Ubuntu 16.04 服务器上。我通过 SSH 远程管理它。 Java 应用程序在其自己的用户下运行,该用户没有 sudo 权限。我使用 sudoers 文件授予该用户启动和停止与 Java 应用程序关联的特定服务的权限。当我需要重新连接到正在运行应用程序的屏幕时,问题就出现了。
最初,这是我在我的服务单元中用于 systemd 启动应用程序的:
ExecStart=/bin/sh -c '/usr/bin/screen -DmS screen-name /usr/bin/java -server -someotheroptions -jar /path/to/jar/file.jar'
当我与特定于 SSH 连接的用户进行 SSH 连接时,对运行应用程序的特定用户执行 sudo,并尝试重新连接到运行应用程序的屏幕,我不断收到此错误:
Cannot open your terminal '/dev/pts/1' - please check.
我相信您知道,错误可能有不同的数字,但大多数情况下我会得到一个“1”。在网上找了一些资料,我不明白我之前怎么没有用/bin/sh启动一个shell,而是把命令改成这个看看有没有什么不同:
ExecStart=/usr/bin/script -q -c "/usr/bin/screen -DmS screen-name /usr/bin/java -server -someotheroptions -jar /path/to/jar/file.jar" /dev/null
这两个命令都可以很好地启动我的应用程序。我可以随意启动和停止服务,然后重新启动并让服务启动没有问题。这一切都有效。除了通过 SSH 重新连接到屏幕。
有没有人知道我可以做些什么来让它工作,以便当我 SSH 进入时,对应用程序的用户执行 sudo 并尝试重新连接,它可以工作?
【问题讨论】:
-
只是为了添加一些细节,我可以 sudo 到应用程序的用户并运行
screen -list并查看我想要的屏幕。所以我知道屏幕正在正确初始化。 -
我还可以通过 crontab 使用
screen -S screen-name -X stuff "commandhere^M"以非交互方式与屏幕交互(发送命令)唯一的问题是重新连接到屏幕,以便我可以看到应用程序事件和命令的输出我输入。
标签: ubuntu ssh systemd gnu-screen