首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >18.04 -如何在系统单元中创建PID文件?

18.04 -如何在系统单元中创建PID文件?
EN

Ask Ubuntu用户
提问于 2018-11-28 21:14:33
回答 1查看 7K关注 0票数 2

我正在尝试用systemd正确地设置我的Min克拉夫特服务器,以便它正确地确定进程的主PID。我有以下系统服务单位:

代码语言:javascript
运行
复制
[Unit]
Description=Minecraft Server
After=network.target

[Service]
User=minecraft
Group=minecraft

WorkingDirectory=/srv/minecraft

ProtectSystem=full
ProtectHome=true

Type=forking

ExecStartPre=/srv/minecraft/mc_server.sh setup
ExecStart=/srv/minecraft/mc_server.sh start

PIDFile=/srv/minecraft/mc.pid

ExecStop=/srv/minecraft/mc_server.sh stop


[Install]
WantedBy=multi-user.target

当我尝试启动服务时,我会收到以下错误消息(主要问题是“未能从文件中解析PID”部分):

代码语言:javascript
运行
复制
minecraft.service - Minecraft Server
   Loaded: loaded (/etc/systemd/system/minecraft.service; enabled; vendor preset: enabled)
   Active: failed (Result: timeout) since Wed 2018-11-28 12:57:03 PST; 6min ago
  Process: 9611 ExecStart=/srv/minecraft/mc_server.sh start (code=exited, status=0/SUCCESS)
  Process: 9591 ExecStartPre=/srv/minecraft/mc_server.sh setup (code=exited, status=0/SUCCESS)
 Main PID: 5213 (code=exited, status=0/SUCCESS)

Nov 28 12:55:32 xxx mc_server.sh[9591]: No Session found.  Creating and configuring.
Nov 28 12:55:32 xxx systemd[1]: minecraft.service: Found left-over process 9607 (tmux: server) in control group while starting unit. Ignoring.
Nov 28 12:55:32 xxx  systemd[1]: This usually indicates unclean termination of a previous run, or service implementation deficiencies.
Nov 28 12:55:32 xxx  systemd[1]: minecraft.service: Found left-over process 9608 (bash) in control group while starting unit. Ignoring.
Nov 28 12:55:32 xxx  systemd[1]: This usually indicates unclean termination of a previous run, or service implementation deficiencies.
Nov 28 12:55:32 xxx  mc_server.sh[9611]: Minecraft server successfully started
Nov 28 12:55:32 xxx  systemd[1]: minecraft.service: Failed to parse PID from file /srv/minecraft/mc.pid: Invalid argument
Nov 28 12:57:02 xxx  systemd[1]: minecraft.service: Start operation timed out. Terminating.
Nov 28 12:57:03 xxx  systemd[1]: minecraft.service: Failed with result 'timeout'.
Nov 28 12:57:03 xxx  systemd[1]: Failed to start Minecraft Server.

我不知道这个错误意味着什么,也不知道如何解决它。如果我删除了PIDfile=选项,那么它可以工作,但是将tmux进程列为主要PID,因此不会在日志中记录来自java进程的输出。我还注意到,它实际上并没有将PID写入mc.pid。当直接运行脚本时,它确实正确地编写了PID。

下面是"mc_server.sh开始“的内容,这就是我如何启动服务器和创建PID文件的方式(注意,mc_server.sh会话是在"mc_server.sh安装”期间创建的):

代码语言:javascript
运行
复制
/usr/bin/tmux send-keys -t minecraft '/usr/bin/java -server -Xmx2048M -Xms1024M -jar /srv/minecraft/minecraft_server.jar nogui' C-m && \
/usr/bin/pgrep -u minecraft -f minecraft_server.jar > /srv/minecraft/mc.pid
EN

回答 1

Ask Ubuntu用户

发布于 2022-11-03 05:49:15

systemd的选项PIDFile用于读取PID,而不是创建。它在文档中提到过

获取引用服务的PID文件的路径。对于Type=设置为分叉的服务,建议使用此选项。指定的路径通常指向/run/下面的文件。如果指定了相对路径,则以/run/作为前缀。服务管理器将在服务启动后从该文件读取服务主进程的PID。服务管理器不会写入在这里配置的文件,但如果服务仍然存在,它将在服务关闭后删除该文件。PID文件不需要由特权用户拥有,但是如果它是由非特权用户拥有的,则执行附加的安全限制:该文件可能不是其他用户拥有的文件的符号链接(既不直接也不是间接的),并且PID文件必须引用已经属于该服务的进程。注意,在现代项目中应该避免使用PID文件。在可能的情况下使用Type=notify或Type=simple,这不需要使用PID文件来确定服务的主要进程,并避免不必要的分叉。

https://stackoverflow.com/a/67724450/15915956也给出了很好的答案

票数 2
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1096933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档