【问题标题】:How can I reload a system daemon?如何重新加载系统守护进程?
【发布时间】:2011-03-31 07:30:27
【问题描述】:

我需要重新加载 Squid 守护进程,解决方法是:

system("/etc/init.d/squid reload\n"); 

但我认为肯定有比使用“系统”调用更高效的解决方案,我应该使用什么C指令?

非常感谢。

【问题讨论】:

  • @Amber: subprocess.call() in C?
  • 这听起来像是一项系统管理任务,最好使用更高级别的“脚本”语言而不是 C。
  • 哦,嘿,我困了。 :) 我原以为涉及守护进程管理的事情会涉及脚本语言(由于 Python 经常涉及 C 模块,因此 C 标记并没有真正让我失望)。

标签: c networking system


【解决方案1】:

让 Squid 重新加载其配置文件的绝对最快的方法是使用 kill() 向守护程序发送 SIGHUP signal。这就是squid -k reconfigure 所做的事情,而这又是/etc/init.d/squid reload 最有可能做的事情。

这种方法的问题在于,您必须以某种方式在 C 代码中发现 squid 守护程序的进程 ID。 PID 通常存储在/var/run(在我的情况下为/var/run/squid.pid)下的某个文本文件中,您可以读取该文件 - 这样可以省去查看进程表的麻烦,但它仍然有点混乱.

考虑到/etc/init.d/squid 也可能正在执行自定义操作,并且您不必每秒左右重新加载守护程序,我会说您应该使用当前的解决方案。如果您不关心脚本的返回状态,您还可以使用常见的fork()exec() 方法,这是异步的,因此从您的应用程序的角度来看更快。

【讨论】:

    【解决方案2】:

    如果您确实需要更快的解决方案,您可以使用 fork 和 exec,但由于必须运行 squid init 脚本,而 Squid 必须完成这项工作,因此对 C 程序的任何优化只会带来非常微小的改进。

    编辑:

    另一方面(在查看了 Squid 手册之后),一些守护进程对信号做出反应,而 Squid 似乎也这样做了。例如,如果您向其发送 HUP 信号,它会重新读取其配置文件:

    kill(process-id-of-the-squid-dameon, SIGHUP);
    

    【讨论】:

    • 就是这样,现在我需要发现 squid 进程 ID。非常感谢。
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多