首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >systemctl显示不活动/死亡,但服务正在运行。

systemctl显示不活动/死亡,但服务正在运行。
EN

Server Fault用户
提问于 2019-02-13 07:37:50
回答 4查看 32K关注 0票数 3

我想使用systemd (systemctl)管理TeamSpeak 3服务器。

当我使用systemctl命令启动/停止/重新启动TeamSpeak 3服务器时,systemctl返回正确的状态:

代码语言:javascript
运行
复制
$ systemctl status ts3server.service
● ts3server.service - TeamSpeak 3 Server
   Loaded: loaded (/etc/systemd/system/ts3server.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-02-12 23:15:18 CET; 1min 11s ago
 Main PID: 842 (ts3server)
   CGroup: /system.slice/ts3server.service
           └─842 ./ts3server inifile=ts3server.ini

Feb 12 23:15:18 hostname.local systemd[1]: Starting TeamSpeak 3 Server...
Feb 12 23:15:18 hostname.local ts3server_startscript.sh[838]: Starting the TeamSpeak 3 server
Feb 12 23:15:18 hostname.local ts3server_startscript.sh[838]: TeamSpeak 3 server started, for details please view the log file
Feb 12 23:15:18 hostname.local systemd[1]: Started TeamSpeak 3 Server.

但当服务停止时(例如)。通过一个自动更新过程),然后重新启动--没有systemctl -- systemctl status命令返回一个不正确的状态:

代码语言:javascript
运行
复制
$ systemctl status ts3server.service
● ts3server.service - TeamSpeak 3 Server
   Loaded: loaded (/etc/systemd/system/ts3server.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Mon 2019-02-11 03:15:16 CET; 1 day 19h ago
Condition: start condition failed at Mon 2019-02-11 03:15:16 CET; 1 day 19h ago
           └─ ConditionPathExists=!/home/teamspeak/.update.lock was not met
  Process: 21740 ExecStop=/home/teamspeak/ts3server_startscript.sh stop (code=exited, status=0/SUCCESS)
  Process: 29220 ExecStart=/home/teamspeak/ts3server_startscript.sh start (code=exited, status=0/SUCCESS)
 Main PID: 29224 (code=exited, status=0/SUCCESS)

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

PID文件就在此时存在:

代码语言:javascript
运行
复制
$ stat /home/teamspeak/ts3server.pid
  File: /home/teamspeak/ts3server.pid
  Size: 4              Blocks: 8          EA Block: 4096   regular file
Device: ca01h/51713d     Inode: 534471      Symbolic Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1001/teamspeak)   Gid: ( 1001/teamspeak)
Access    : 2019-02-12 23:15:09.192927211 +0100
Modified: 2019-02-12 23:15:09.188927218 +0100
Changed   : 2019-02-12 23:15:09.188927218 +0100
 Birth    : -

带有这个PID的进程正在运行,我可以连接到这个TeamSpeak 3服务器。

/home/teamspeak/.update.lock存在于自动更新过程运行时。更新后,文件将被删除/删除,并且不再存在。

systemctl显示正确的状态,当我在systemctl重新启动服务时终止运行的服务PID时,稍后使用systemd更正。

这是我的/etc/systemd/system/ts3server.service文件:

代码语言:javascript
运行
复制
[Unit]
Description=TeamSpeak 3 Server
After=network.target mysqld.service
ConditionPathExists=!/home/teamspeak/.update.lock

[Install]
WantedBy=multi-user.target
Alias=ts3server.service

[Service]
User=teamspeak
Group=teamspeak
WorkingDirectory=/home/teamspeak/
ExecStart=/home/teamspeak/ts3server_startscript.sh start
ExecStop=/home/teamspeak/ts3server_startscript.sh stop
ExecReload=/home/teamspeak/ts3server_startscript.sh restart
PIDFile=/home/teamspeak/ts3server.pid
Restart=always
Type=forking

为什么systemctl不能返回正确的状态,尽管TeamSpeak 3服务器是以不同的方式正确启动的?

EN

回答 4

Server Fault用户

发布于 2019-02-13 18:55:55

您应该将单元文件中的Type更改为simple,这样就可以工作了。IIRC forking需要显式调用fork()方法,而您可以从bash脚本启动它,而且根本没有fork()调用。

票数 2
EN

Server Fault用户

发布于 2019-02-19 23:39:12

您的“为什么”问题的答案是,systemd正在寻找它所知道的PID (在上面的示例输出中为842),它不跟踪服务自己的PID信息。如果该进程不再运行,systemd就不知道该进程发生了什么。它也不能重新启动它(因为端口已经被新实例绑定了)。

可能是一种更干净的方式进行升级

  1. 使用systemctl停止服务
  2. 执行更新,然后
  3. 使用systemctl启动进程。
票数 1
EN

Server Fault用户

发布于 2020-05-08 00:19:34

诀窍是指定Type=oneshotRemainAfterExit=yes,而不指定PIDFile=

Minimal示例:

代码语言:javascript
运行
复制
[Unit]
Description=service that is restarted by externalities.

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/startup.sh
ExecStop=/stop.sh

[Install]
WantedBy=multi-user.target

文档称它为"停工一站式服务

与oneshot服务类似,有时有些单元需要执行一个程序来设置某个东西,然后执行另一个程序来关闭它,但是当它们被视为“已启动”时,没有一个进程保持活动状态。

但是他们没有考虑启动的程序改变PID值的用例,即使它也是这样工作的。

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

https://serverfault.com/questions/953663

复制
相关文章

相似问题

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