我正在试着为我的孩子设置一个“我的世界”服务器,屏幕让我感觉很舒服。我一直在关注this教程,我已经咨询了this AskUbuntu answer。我在Ubuntu16.04.5 x64上运行。我已经创建了以下Service文件,并将其链接到/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 post,我已经更改了/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会话,则会出现第二个“No screen session found”错误。
我可以从命令行使用'screen -dmS Minift..‘启动服务器。然后重新连接。我既可以以root用户的身份执行此操作,也可以以'minecraft‘用户的身份执行此操作。
任何帮助都将不胜感激
发布于 2018-08-06 20:42:58
我手头没有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.\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(这可能是一个bug,具体取决于systemd和udev的版本。)因此,当私有名称空间中的/dev/ptmx被替换为指向/dev/pts/ptmx的符号链接时,您将无法再打开新的pty。测试的一个简单修复是sudo chmod a+rw /dev/pts/ptmx,它确实使单元工作并启动screen进程。
对于您来说,情况可能并非如此,但您可以采用类似的调试方法来尝试发现问题。
https://stackoverflow.com/questions/51695474
复制相似问题