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