2017-09-05 142 views
0

如何建立一个systemd服务使用屏幕,并且仍然可以重新连接到屏幕上的Java应用程序?我已经搜索了一个答案,并尝试了几个不同的东西,但我认为systemd正在向整个事情投入一个扳机。Ubuntu的,屏幕,SSH和Systemd

我有一个Java应用程序设置为在systemd服务运行。它使用屏幕,因为我需要能够在它运行之后以交互方式处理它。它在没有GUI的Ubuntu 16.04服务器上。我通过SSH远程管理它。 Java应用程序在它自己的用户下运行,它不具有sudo权限。我使用sudoers文件来授予该用户启动和停止与Java应用程序关联的特定服务的权限。 。问题是当我需要重新安装到屏幕上的应用程序在运行

原来,这是我用在systemd我的服务单位如何启动应用程序:

​​

当我SSH与特定的SSH连接的用户,sudo来,该应用程序运行的,并尝试重新连接到该应用程序在运行时屏幕的特定用户,我不断收到此错误:

Cannot open your terminal '/dev/pts/1' - please check. 

错误,我相信你知道,可以有不同的数字,但大多数时候我会得到'1'我它。网上找了一些资料后,我不明白为什么我不是前开始/ bin/sh的外壳,但改变了命令,这,看看它所做的任何差异:

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来应用程序的用户,并尝试重新连接,它的工作原理?

+0

我想补充一些细节,我可以sudo来应用程序的用户,并运行'屏幕-list',看到我想要的画面。所以我知道屏幕正在初始化。 – Tyrelius

+0

我也可以交互(发送命令)与屏幕非交互,从crontab中,使用'屏幕-S屏幕名称-X东西“commandhere^M”'唯一的问题是重新连接到屏幕上,这样我可以看到从我输入的应用程序事件和命令输出。 – Tyrelius

回答

0

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

因此,为了澄清其他人在看到一般可见回答如下:https://serverfault.com/questions/116775/sudo-as-different-user-and-running-screen/116830

  • 您设置systemd启动您的屏幕会话分离。
  • 当你想连接时,你SSH进入你的盒子。
  • 然后,您向正在运行该屏幕会话的用户申请。
  • 一旦您向该用户发布任何信息,即可运行script /dev/null
  • 现在,您可以使用screen -r screen-name重新附加到该屏幕。