【问题标题】:how do I get a process to reload itself in linux?如何让进程在 linux 中重新加载自身?
【发布时间】:2010-10-12 06:08:55
【问题描述】:

我有一个服务,比如 foo,用 C++ 编写,以 root 身份运行。有通常的脚本,/etc/init.d/foo start|stop|restart。

在某些时候, foo 需要重新加载自己。通常在升级完成后。但是做这样的事情:

system("/etc/init.d/foo restart")

不起作用,因为只要重新启动杀死 foo,system() 调用显然也会被杀死,并且重新启动脚本永远不会执行完成。

是否可以使用另一个调用来代替 system() 作为调用进程的同级异步运行,而不是创建同步子进程?

谢谢!

【问题讨论】:

    标签: c++ linux process reload restart


    【解决方案1】:

    您考虑过exec[*] 家族吗?这是一个——execve

    【讨论】:

    • 谢谢。我必须研究的另一个技巧是调用 fcntl() 在服务器侦听端口上设置 FD_CLOEXEC。否则 exec'd() 应用程序将继承原始套接字并让我伤心。
    【解决方案2】:

    您可以将它放在 inittab 中,让 init 在它因任何原因退出时担心重新启动进程。如果您的进程发生崩溃或 assert() 或以其他方式意外退出,这也将负责自动重启。

    然后,为了处理您的用例,该进程将自行终止。

    【讨论】:

      【解决方案3】:

      fork() 后跟 exec() 怎么样?

      【讨论】:

      • 这种情况下不需要fork,只需exec()即可。
      【解决方案4】:

      考虑实施

      /etc/init.d/foo reload
      

      为你的守护进程(通过我的 Debian 盒子的 grep 判断相当标准)。

      这通常通过向进程发送 SIGHUP 信号来完成; 守护进程应该有一个信号处理程序来捕捉这个 并重新加载任何配置。

      如果进程知道它需要重新加载,它可以自己发出信号。

      如果您确实需要重新启动以获取新库,请使用 exec*()

      【讨论】:

        【解决方案5】:

        结合到目前为止的两个答案,使用fork-exec

        【讨论】:

          【解决方案6】:

          补充一下 Ori 已经说过的,一些 Linux 发行版仍然使用 initab,但是 Ubuntu 和可能其他的已经切换到 /etc/event.d。您将文件放在那里(复制并编辑现有文件之一)然后使用“sudo start ssh_tunnel”或您调用的任何文件启动守护程序。

          然后当你需要重启的时候,你可以用一个信号杀死它,系统会重启它。或者它可以通过调用“exit(0);”自行决定是时候重新启动了。或其他。

          【讨论】:

            【解决方案7】:

            exec*() 本身在原始命令行上应该可以解决问题。您可能可以省略分叉,因为您有两个不需要的副本正在运行,然后需要退出原始副本。

            但还要根据您的发行版查看 inittab 和 event.d,看看它是否会以更好的方式满足您的需求。

            【讨论】:

              【解决方案8】:

              Ori 和 Paul 建议的第三种可能性是使用 daemontools。它更便携,但不太可能可用。您创建一个名为 /service/foo/run 的脚本,daemontools 将在它退出时重新生成您的服务。

              http://cr.yp.to/daemontools.html

              【讨论】:

                【解决方案9】:

                查看 inittab 的手册页。

                它描述了如果系统死亡(重生),系统将如何自动重启您的进程。

                正确设置后,您的服务所要做的就是退出,系统会自动为您处理重新启动(重生)。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-01-08
                  • 2019-12-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-01-31
                  • 2018-11-10
                  相关资源
                  最近更新 更多