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

时间:2018-08-05 15:05:17

标签: minecraft boot systemd gnu-screen

我正在尝试为我的孩子设置一个我的世界服务器,而屏幕正适合我。我一直在关注this教程,并且已经咨询了this 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

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

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 个答案:

答案 0 :(得分:1)

我没有Ubuntu,但是我在Fedora 24上尝试了类似的操作,并且出现了类似的错误。为了进行调查,我在strace命令中添加了screen,并删除了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.\r\nSorry, could not "..., 52) = 52

我向单元添加了一些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

(这可能是一个错误,具体取决于systemd和udev的版本。) 因此,当/dev/ptmx在专用命名空间中被指向/dev/pts/ptmx的符号链接替换时,您将无法再打开新的pty。 sudo chmod a+rw /dev/pts/ptmx是一个简单的测试解决方案,确实使部门工作并开始了screen进程。

对于您来说可能不是这种情况,但是您可以采用类似的调试方法来尝试查找问题。