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

Systemd服务使用屏幕:“未找到屏幕会话”

阎丰
2023-03-14

我正试着为我的孩子安装一个minecraft服务器,屏幕让我很舒服。我已经参考了本教程的答案。我在Ubuntu 16.04.5 x64上运行。我创建了以下服务文件,并将其链接到/etc/systemd/system/minecraft。服务

[Unit]
Description=Minecraft Server
Documentation=

Wants=network.target
After=network.target

[Service]
User=minecraft
Group=minecraft
Nice=5
EnvironmentFile=-/var/minecraft/unit.conf
KillMode=none
SuccessExitStatus=0 1

ProtectHome=true
ProtectSystem=full
PrivateDevices=true
NoNewPrivileges=true
PrivateTmp=true
InaccessibleDirectories=/root /sys /srv -/opt /media -/lost+found
ReadWriteDirectories=/var/minecraft/server /usr/bin/screen
WorkingDirectory=/var/minecraft/server
#ExecStartPre= /usr/bin/screen -dmS Minecraft
ExecStart= /usr/bin/screen -dm -S Minecraft '/usr/bin/java -Xmx1500M -Xms1024M -jar /var/minecraft/server/craftbukkit-1.13.jar'
ExecStop=/usr/bin/screen -S minecraft -p 0 -X stuff "stop^M"

[Install]
WantedBy=multi-user.target

当我监视服务启动时,我在Journal alctl日志中得到以下内容:

Aug 05 14:55:41 spigot-1 systemd[1]: Started Minecraft Server.
Aug 05 14:55:41 spigot-1 screen[9869]: No screen session found.

根据我引用的SO帖子,我已经在/var/run/screen中更改了权限。这是当前的设置:

root@spigot-1:/var/minecraft/server# ls -alR /var/run/screen/
/var/run/screen/:
total 0
drwxrwxrwx  4 root      root       80 Aug  5 14:12 .
drwxr-xr-x 23 root      root      860 Aug  5 14:11 ..
drwx------  2 minecraft minecraft  40 Aug  5 14:55 S-minecraft
drwx------  2 root      root       40 Aug  5 14:50 S-root

/var/run/screen/S-minecraft:
total 0
drwx------ 2 minecraft minecraft 40 Aug  5 14:55 .
drwxrwxrwx 4 root      root      80 Aug  5 14:12 ..

/var/run/screen/S-root:
total 0
drwx------ 2 root root 40 Aug  5 14:50 .
drwxrwxrwx 4 root root 80 Aug  5 14:12 ..

**调试说明**您将在其中看到注释的ExecStartPre命令。。。如果我试图用该命令启动屏幕会话,就会出现第二个“未找到屏幕会话”错误。

我可以使用“screen-dmS Minecraft[..”从命令行启动服务器然后重新连接。我既可以作为root用户,也可以作为“minecraft”用户。

任何帮助都将不胜感激

共有1个答案

糜俊彦
2023-03-14

我手头没有Ubuntu,但我在Fedora 24上尝试了类似的东西,但也出现了类似的错误。为了进行调查,我在屏幕命令中添加了strace,并删除了PrivateTmp,以便获得跟踪输出。

ExecStart=/bin/strace -o /tmp/s -f screen -dm -S me bash -c 'sleep 999'

在输出中,我发现在最后,屏幕试图打开一个伪tty,但失败了:

open("/dev/ptmx", O_RDWR)         = -1 EACCES (Permission denied)
...
write(1, "No more PTYs.\r\nSorry, could not "..., 52) = 52

我向该单元添加了一些ls-l/dev命令,以查看PrivateDevices=true选项的效果。确实有一个/dev/ptmx文件,但与我真正的/dev不同,它是指向/dev/ptmx的符号链接,而不仅仅是特殊字符设备。出于某种原因,在我的系统中,我有:

$ ls -l /dev/ptmx /dev/pts/ptmx
crw-rw-rw- 1 root tty  5, 2 Aug  6 14:29 /dev/ptmx
c--------- 1 root root 5, 2 Jun 27 08:29 /dev/pts/ptmx

(这可能是一个bug,具体取决于systemd和udev的版本。)因此,当私有名称空间中的/dev/ptmx被指向/dev/pts/ptmx的符号链接替换时,您将无法再打开新的pty。一个简单的测试修复方法sudo chmod A rw/dev/pts/ptmx,它确实使单元工作并启动屏幕过程。

您可能不是这样,但您可以采用类似的调试方法来尝试查找问题。

 类似资料:
  • 如何为使用screen的Java应用程序设置systemd服务,并且仍然能够重新连接到该屏幕?我到处寻找答案,并尝试了几种不同的方法,但我认为systemd是在破坏整个过程。 我有一个Java应用程序设置为在system d中作为服务运行。它使用屏幕,因为我需要在它运行后能够交互式地使用它。它在Ubuntu 16.04服务器上,没有图形用户界面。我通过SSH远程管理它。Java应用程序在自己的用户

  • 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

  • 我试图根据用户输入的坐标捕捉区域截图。基本上,用户在屏幕上点击得到x,y坐标,然后在其他地方点击另一对x,y坐标,然后将其放入一个矩形中,并使用机器人库创建屏幕截图。 我有的问题是,我得到了随机截图,这不是用户输入的坐标,我怎么能考虑包括0的坐标,因为矩形值必须超过1。 以下是我迄今为止的代码:

  • 我试图移动这个图像: 在我的PyGame屏幕上,从右到左再向后,但是随着图像的移动,每隔一秒左右我就会有一点屏幕撕裂,就像这样: 我使用的代码是类似于此的循环: 到目前为止,我已经尝试了以下方法来解决这个问题: 在创建屏幕时使用,,标志,这没有效果,我也调整了更新为(因为使用?)时建议使用此选项) 在GPU和CPU之间拆分内存(我在raspberry pi 2上运行此功能)我尝试过为这两个处理器提