代码之家  ›  专栏  ›  技术社区  ›  Stéphane

如何让进程在linux中重新加载自身?

  •  2
  • Stéphane  · 技术社区  · 17 年前

    我有一个服务,比如说Foo,用C++编写,它运行为root。这里有一个常见的纸条,/etc/init.d/foo start | stop | restart。

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

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

    不起作用,因为一旦restart杀死foo,system()调用显然也会被杀死,并且restart脚本永远不会执行到完成。

    谢谢

    9 回复  |  直到 17 年前
        1
  •  9
  •   dirkgently    17 年前

    你考虑过这个问题吗 exec[*] 有家人了吗?这里有一个-- execve .

        2
  •  9
  •   Ori Pessach    17 年前

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

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

        3
  •  5
  •   Eric Petroelje    17 年前

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

        4
  •  2
  •   timday    17 年前

    考虑实施

    /etc/init.d/foo reload
    

    这通常通过向过程发送SIGHUP信号来完成; 并重新加载任何配置。

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

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

        5
  •  1
  •   Adam Rosenfield    17 年前

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

        6
  •  1
  •   Paul Tomblin    17 年前

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

    然后,当您需要它重新启动时,您可以用一个信号终止它,系统将重新启动它。或者,它也可以通过调用“exit(0);”或其他命令,自行决定是时候重新启动了。

        7
  •  1
  •   Rob K    17 年前

    exec*() 在最初的命令行上,它本身就可以做到这一点。您可能可以省略fork,因为这样您就有两个不需要的副本正在运行,而原始副本需要退出。

    但也要看inittab和event.d,这取决于您的发行版,看看它是否能更好地满足您的需要。

        8
  •  1
  •   bstpierre Edgar Aviles    17 年前

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

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

        9
  •  0
  •   Loki Astari    17 年前

    查看inittab的手册页。

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

    正确设置后,您的服务所要做的就是退出,系统将神奇地为您重新启动(重生)。