使用屏幕的系统服务:"未找到屏幕会话"



我正试图为我的孩子设置minecraft服务器,屏幕让我很不舒服。我一直在遵循这个教程,我已经查阅了这个AskUbuntu的答案。我在Ubuntu 16.04.5 x64上运行。我已经创建了以下服务文件,并将其链接到/etc/systemd/system/minecraft.Service.

[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

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

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"用户来做这件事。

如有任何帮助,将不胜感激

我手头没有Ubuntu,但我在Fedora 24上尝试了类似的操作,但出现了类似的错误。为了进行研究,我在screen命令中添加了一个strace,并删除了PrivateTmp,以便获得跟踪输出。

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

在输出中,我发现最后screen试图打开一个伪tty,但没有成功:

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

我在Unit中添加了一些ls -l /dev命令,看看PrivateDevices=true选项的效果如何。确实有一个/dev/ptmx文件,但与我真正的/dev不同,它是到/dev/pts/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过程。

这可能不是你的情况,但你可以采取类似的调试方法来尝试找到问题。

最新更新