【问题标题】:Systemd service using screen: 'No screen session found'使用屏幕的 Systemd 服务:“未找到屏幕会话”
【发布时间】:2018-08-05 15:05:16
【问题描述】:

我正在尝试为我的孩子设置一个我的世界服务器,但屏幕让我很适应。我一直在关注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 和“我的世界”用户身份执行此操作。

任何帮助将不胜感激

【问题讨论】:

  • 从票数接近的情况来看,您可能应该在 unix.stackexchange.com 上发布此内容,但无论如何请看我的回答。
  • 你为什么使用screen?您将在journal 中找到程序输出。

标签: minecraft boot systemd gnu-screen


【解决方案1】:

我手头没有 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

(这可能是一个错误,取决于 systemd 和 udev 的版本。) 因此,当 /dev/ptmx 在私有命名空间中被 /dev/pts/ptmx 的符号链接替换时,您将无法再打开新的 pty。一个简单的测试修复是sudo chmod a+rw /dev/pts/ptmx,它确实使单元工作并启动screen进程。

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

【讨论】:

  • 谢谢 - 只要我的工作时间允许,我会尽快尝试。如果可行,我会将答案标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多