systemctl显示非活动/已死,但服务正在运行

分享于 

5分钟阅读

互联网

 

问题:

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

使用systemctl命令 start/stop/restart TeamSpeak 3服务器时,systemctl将返回正确的状态:


$ 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 命令返回不正确的状态:


$ 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文件存在于这里时刻:


$ 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 显示正确的状态,当我使用systemd重新启动服务时,当 systemctl 使用正确地重新启动。

这是我 /etc/systemd/system/ts3server.service file:


[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服务器以不同的方式正确启动?


回答 1:

你应该在单元文件中将 Type 更改为 simple,它将工作。 IIRC forking 需要显式调用 fork() 方法,而且从bash脚本启动它,并且没有 fork() 调用。


回答 2:

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

升级的更简洁的方法是

  • 使用systemctl停止服务
  • 执行更新,然后
  • 使用systemctl启动进程。


SYS  系统  服务  显示  Systemc  
相关文章