Systemd:类型=分叉与 PIDFile

Systemd:类型=分叉与 PIDFile

在 Unix 管理员systemd --user为我们的应用程序帐户启用后,我创建了以下服务模板(本身首先从 Ansible 模板生成,您可能会注意到 - 因为 RHEL7 上的 systemd-version 尚不理解%H):

[Unit]
Description=%i Secondary Services

[Install]
WantedBy=default.target

[Service]
WorkingDirectory=%h/apps/%i
{% set ICODE = ansible_hostname | upper %}
ExecStartPre=test -d %h/apps/%i/adco/datafiles
ExecStart=/bin/bash ./launchapp /INSTALLATION_CODE:{{ ICODE }}
ExecStop=/bin/bash ./launchapp /INSTALLATION_CODE:{{ ICODE }} -k
Type=forking
PIDFile=%h/apps/%i/logs/{{ ICODE }}.pid
Restart=always
RestartSec=7
StartLimitBurst=0
Nice=7
TimeoutSec=3593

使用它,我们能够创建多项服务——为共享服务器上应用程序的每个实例创建一个服务。这个工作持续了大约两个月,直到上周修补操作系统为止。

打补丁后,服务将在所有打过补丁的机器上不断重新启动。不是因为我们的应用程序有任何问题(没有改变),而是因为进程systemd --user本身重新启动。

我们的 Unix 支持人员试图理解为什么并且不能 - 它所记录的只是“重新启动”,根据他们的说法(RHEL 就是这样,凡人无法读取/var/log/messages自己 - 它需要 root)。

当他们试图了解发生了什么时,我注释掉了该Type=forking行 - 然后重新启动停止了!systemctl --user status列出所有服务:从systemd --user下到上模板的多个实例。

问题:

  1. 我们自己可能出了什么问题systemd --user——不断重启?启动的应用程序占用大量资源,启动了大约 40 个相当大的进程。但这以前从来都不是问题...也许,启动的进程数量有限制systemd --user?或者他们的内存使用总量?如果是这样的话,为什么我们之前没有击中它呢?
  2. 为什么注释掉Type-line 有帮助?
  3. systemd如果主进程(其 PID 记录在 PID 文件中)消失,注释掉的成本是多少 - 例如,仍然会注意到吗?重新启动时它仍然会启动应用程序实例吗?

相关内容