这不是模拟或理论,它是现实生活,它并不像你想象的那么丰富多彩,所以我再次向他求助,当程序没有以正确的方式处理它时,如何在断电重新启动后抵消孤立的 PID 文件的存在

这不是模拟或理论,它是现实生活,它并不像你想象的那么丰富多彩,所以我再次向他求助,当程序没有以正确的方式处理它时,如何在断电重新启动后抵消孤立的 PID 文件的存在

我遇到这样的情况

  1. 停电了
  2. 停电时 UPS 电池电量耗尽
  3. 机架中的服务器因断电而关闭
  4. 电力恢复
  5. 服务器已启动且操作系统正在启动
  6. systemd 正在做它的工作

现在一些软件(systemd 服务启动脚本)处于深深的黑洞中,因为它们启动 ryles 取决于 pid 文件是否存在,而不是检查 pid 文件(var/run)进程中的 PID(数字)是否仍然存在 拒绝启动,这会导致不必要的级联......

现在我的问题

  1. 因为我不是软件设计师,我也无法成为软件管理员来让/强迫设计师让他的创作“正确或应该”工作
  2. 我无法不断地掌握脉搏以检查所有服务是否按预期工作,尤其是在每次更新之后

3)如何在全球范围内维持这种状况?

a) its good idea o make a script and execute it on systemd service 
on each boot of server (linux kernel) to verify of pid file
processes existence ?  in case  of ps gone delete the pid file  

b) if so where such entry point for such service should be

c) how such script should handle the systemd services 
especially multiple .services file  location and the pid file named in those service files *with use of find or grep tools" .. 
as a blocking service ? it wold be a time cost solution ... 

d) or there is already better solution if so which one ? or some already made soft ?

maybe just hook after a init (process) ? and do just rm all *.pid ? by find -name *.pid ? exec rm ? it wold be 99% of job done :D

or do a systemd unit ExecStartPre= script for such each service to delete itself ? but it wold be time consuming to trace and edit service file and there is a "update" issue when sysyemd scirpt get changed by author ???

  1. 或者是否有一个独特的节可以为每个 systemd 服务批量/全局执行 PreExecScipt 而不会干扰服务脚本?

附:

最后一个问题......当我要求解决我真正的问题时,你(作为受害者)你会因为开发人员的错误而惩罚我,因为我的...为什么?

我对其他错误或不良知识或缺乏知识不承担任何责任

PS2。

“我无法查看我每天使用和安装的每个软件的性能,但有一个这样的群体,所以我遇到了类似的问题,我希望能够阻止它”

ps3。好的,当它转到 跑步文件夹我知道我的 DEBIAN 和其他发行版的规则,例如:

https://wiki.debian.org/ReleaseGoals/RunDirectory#How_to_transition_from_.2Fvar.2Frun_to_.2Frun_and_.2Fvar.2Flock_to_.2Frun.2Flock.3F

https://wiki.debian.org/ReleaseGoals/RunDirectory#Packages_using_.2Fvar.2Frun_and_.2Fvar.2Flock

https://wiki.debian.org/ReleaseGoals/RunDirectory#Why_can.27t_.2Fvar.2Frun_and_.2Fvar.2Flock_stay_under_.2Fvar.3F

这不是模拟或理论,它是现实生活,它并不像你想象的那么丰富多彩,所以我再次向他求助,当程序没有以正确的方式处理它时,如何在断电重新启动后抵消孤立的 PID 文件的存在

来自软件开发人员手册

Kea 的服务器在启动时创建 PID 文件。 keactrl 使用这些文件来确定给定服务器是否正在运行。如果发出启动命令时一台或多台服务器正在运行,则输出类似于以下内容:

keactrl start
INFO/keactrl: kea-dhcp4 appears to be running, see: PID 10918, PID file: /usr/local/var/run/kea/kea.kea-dhcp4.pid.
INFO/keactrl: kea-dhcp6 appears to be running, see: PID 10924, PID file: /usr/local/var/run/kea/kea.kea-dhcp6.pid.
INFO/keactrl: kea-dhcp-ddns appears to be running, see: PID 10930, PID file: /usr/local/var/run/kea/kea.kea-dhcp-ddns.pid.
INFO/keactrl: kea-ctrl-agent appears to be running, see: PID 10931, PID file: /usr/local/var/run/kea/kea.kea-ctrl-agent.pid.
INFO/keactrl: kea-netconf appears to be running, see: PID 10123, PID file: /usr/local/var/run/kea/kea.kea-netconf.pid.

在正常关机期间,这些 PID 文件会被删除;然而,它们可能会在系统崩溃后作为残留物留下。尽管可能性很小,但在系统重新启动时,它们包含的 PID 实际上可能引用与 Kea 无关的进程。这种情况将导致 keactrl 判定服务器正在运行,而实际上它们并未运行。在这种情况下,必须手动删除 keactrl 输出中列出的 PID 文件。

所以我们以非易失性 inode -> /usr/local/var/run 中的 pid 结束

一切顺利 T. Best 又名 ceph3us

答案1

正如您所发现的,系统启动时仍然存在的 PID 文件无法正确表示系统的新状态。挥之不去的 PID 文件会误导初始化过程并破坏它。使用 PID 文件的一个基本假设是将它们写入易失性路径,以便在断电时将其丢弃。

PID 文件的约定是使用/run易失性文件系统所需的路径。通常这是一个临时文件系统仅存在于易失性 RAM 中。由于历史原因,还有一个从非易失性文件系统/var/runie 的名为 run 的符号链接/var/run -> /run。相反,挂载的文件系统/usr/local不是预计会出现波动。另请参阅文件系统层次结构标准

链接到/运行

一个简单的解决方案可能是链接到/run您的服务想要写入其 PID 文件的任何位置。链接目录将具有与标准路径相同的语义。

您已确定的有问题的 PID 文件凯亚服务是/usr/local/var/run这样的:

# (first stop whatever is using /usr/local/var/run)
# rm -Rf /usr/local/var/run
# ln -s /run /usr/local/var/run

我认为,这是一种解决方法,正确的解决方案是修复凯亚服务脚本使用标准路径。但使用此链接应该是一个安全的选择,可以为您省去麻烦。使用这条路径的任何其他人也将受益。

然而,/run它是由 root 拥有的,因此只有当使用的服务/usr/local/var/run以 root 身份运行时,此解决方法才有效。如果没有,链接到/tmp是另一种解决方法;也可以看看清除以下。

请注意,如果有其他位置存储非易失性 PID 文件,您可能必须在安装中的其他位置应用此解决方法。

重新配置

您可能拥有的另一个选择是配置有问题的脚本以使用正确的路径。通常初始化脚本会从默认文件例如/etc/default/kea。您必须查阅服务文档或脚本来查找可用的选项。

清除

对于使用专用帐户写入 PID 文件的服务(例如kea 用户)您可以通过使用该帐户的 cron 表条目在启动时删除它来模拟其 PID 文件的预期波动性。例如:

@reboot rm -f /usr/local/var/run/kea.pid

该示例将被编辑为:# crontab -e -u kea-user

相关内容