我正在使用 s6 (http://skarnet.org/software/s6/) 来监督流程。
我已经在数十个 docker 实例和服务器上的数百个进程中成功运行了该功能。但在稳定的系统上,我遇到了一个新问题。
我为 ClamAV 设置了一个服务,并在 /etc/services.d/clamv/run 中启动该进程:
exec s6-setuidgid clamav /opt/clamd
它启动了,但是 Clam 的启动周期很长,大约一分二十秒后(大概是它完成数据库加载后)S6 启动其他clam 实例。我可以用 ps 查看它们:
2286 clamav 0:00 /opt/clamd
5091 clamav 0:58 /opt/clamd
加载完成后,第二个实例尝试使用套接字并触发错误:
Socket file /run/clamav/clamd.sock is in use by another process
有趣的是,使用 ps aux - 第一个过程的 TIME 列增加到 1:18 然后返回到零 - 然后第二个实例以相同的方式计数。
如果我让它运行,当第二个进程完成启动时,s6 似乎会尝试启动另一个进程 - 但奇怪的是,使用 ps aux 没有出现其他进程。
我已经确认 clam 仅在长时间启动后创建 sock 和 pid 文件。
显而易见的问题——我该如何解决这个问题,以便 s6 不会在长时间启动结束时启动第二个实例。
答案1
答案与 s6 无关 - 我将 clamd.conf 文件放在了错误的位置,因此它选择了错误的设置。clamd 默认在后台运行 - 因此 s6 无法监督该过程。
随着蛤蜊开始出现在前景中,一切都按预期进行。