当前位置: 首页 > 知识库问答 >
问题:

Ubuntu,屏幕,SSH和Systemd

穆宾白
2023-03-14

如何为使用screen的Java应用程序设置systemd服务,并且仍然能够重新连接到该屏幕?我到处寻找答案,并尝试了几种不同的方法,但我认为systemd是在破坏整个过程。

我有一个Java应用程序设置为在system d中作为服务运行。它使用屏幕,因为我需要在它运行后能够交互式地使用它。它在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到应用程序的用户,并尝试重新连接,它就工作了吗?

共有1个答案

孟杰
2023-03-14

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

因此,为了让其他人在看到常见的答案后看到这一点,例如:https://serverfault.com/questions/116775/sudo-as-different-user-and-running-screen/116830

  • 您已设置systemd以启动屏幕会话
 类似资料:
  • screen 模块用于检索有关屏幕大小,显示,光标位置等的信息 进程: 主进程 渲染进程​ screen 是一个 EventEmitter. 注意: app模块必须用在 ready事件后. 注意: 在渲染进程或开发者工具栏中, window.screen 是一个预设值的 DOM属性, 所以 var screen = require('electron').screen 这样写的话是无效的. 创建一

  • 我的有问题,当我在手机上启动应用程序时,它会显示约0.5秒的白色屏幕。扩展了,在中,我声明为启动器,肖像模式为。 代码: XML:

  • 问题内容: 在终端中工作时,我看到了最后一个Shell命令执行输出的历史记录。如果运行vim,我会看到全屏打开的文件。退出vim时,我可以再次看到最后一个shell命令的历史记录。 但是,当我从屏幕上使用vim时。我在退出vim时看到的是刚刚编辑的文件的足迹,而不是最后一个shell命令的历史记录。 我想看看外壳的历史。 我该如何实现这种行为? 我用了: terminal.app和iterm2.a

  • 嗨,我在libgdx切换屏幕时遇到了问题。我正在建造一个小行星游戏克隆。因此,首先呈现我的Main MenuScreen类(使用Fitviewport),然后我调用setScreen()到GameScreen(GameScreen不使用Fitviewport),除了第二个屏幕呈现为使用Fitviewport。如果我调整第二个屏幕的大小,那么整个窗口用于渲染。为什么会发生这种情况?这里有一些图片..

  • 多亏了我在这个论坛上解决其他问题的帮助,我成功地推进了我的项目,但另一个障碍出现在我的道路上。 我有麻烦在libgdx java实现多个屏幕。我想知道如何实现多个屏幕(一个用于主菜单,一个用于播放,一个用于加载屏幕,...)。 关于我应该如何构造我的屏幕类的一个例子或一些解释将非常有帮助。我试着实现我自己的屏幕管理器,但不太顺利...还有一些关于我应该如何处理屏幕的提示,因为每次从主菜单到播放或选

  • 调整屏幕的亮度 导航至 Settings(设定)应用程式,找到并轻触 Display(显示)。 轻触Adjust brightness(调节屏幕亮度)。 选择并轻触所需的亮度。 您可以通过调暗手表屏幕的亮度来延长电池的使用寿命。 打开/关闭 Always-on screen(保持启用屏幕) 您可选择是否想让屏幕暗淡地显示时间,或未使用手表时将屏幕完全关闭。 通过 M600 更改设定 导航至设置应用