web-dev-qa-db-ja.com

systemctlは非アクティブ/デッドを示していますが、サービスは実行中です

Systemd(systemctl)でTeamSpeak 3サーバーを管理したいと思います。

Systemctlコマンドを使用して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は正しいステータスを示しています。systemctlが後でsystemd correctを使用してサービスを再起動すると、実行中のサービスPIDが強制終了されます。

これが私の/etc/systemd/system/ts3server.serviceファイル:

[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

TeamSpeak 3サーバーが別の方法で正しく起動されているにもかかわらず、systemctlが正しいステータスを返さないのはなぜですか?

2
user2966991

ユニットファイルのTypesimpleに変更する必要があります。 IIRC forkingfork()メソッドの明示的な呼び出しを必要としますが、bashスクリプトから開始すると、fork()呼び出しはありません。

2
Gothrek

「なぜ」の質問に対する答えは、systemdが認識しているPID(上記の出力例では842)を探しているということです。サービス自体のPID情報は追跡されません。そのプロセスが実行されなくなった場合、systemdはそのプロセスで何が行われているのかわかりません。また、ポートはすでに新しいインスタンスによってバインドされているため、再起動することもできません。

おそらく、アップグレードを行うよりクリーンな方法は

  1. Systemctlを使用してサービスを停止します
  2. アップデートを実行してから、
  3. Systemctlを使用してプロセスを開始します。
0
Kevin Colagio