【问题标题】:Ubuntu, Screen, SSH, and SystemdUbuntu、Screen、SSH 和 Systemd
【发布时间】: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


【解决方案1】:

我想我终于明白了答案。当人们说在运行 screen 之前运行 script /dev/null 时,他们并不是说在通过 systemd 启动 screen 会话之前运行它。他们的意思是当你 ssh 和 sudo 到应用程序的用户时运行它。运行它后,当您处于脚本会话中时,您可以使用 screen 重新附加到您的应用正在运行的屏幕。

因此,向其他可能在看到通常提到的答案后看到的人澄清一下,例如:https://serverfault.com/questions/116775/sudo-as-different-user-and-running-screen/116830

  • 您设置 systemd 以分离启动屏幕会话。
  • 当您想要连接时,您可以通过 SSH 进入您的盒子。
  • 然后您对正在运行该屏幕会话的用户执行 sudo。
  • 一旦你对那个用户使用了 sudo,你就运行 script /dev/null
  • 现在,您可以使用 screen -r screen-name 重新附加到该屏幕。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2017-08-29
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多