1

我有我用 C++ 编写的 Linux 守护程序,当用户通过网络通过其控制台给出“重新启动”命令时,它应该自行重新启动。这可能吗?我使用/etc/init.d脚本。如何对其进行编程以重新启动?我是否应该启动一个延迟很长(一分钟)的新进程,然后再次触发 shell 脚本?问题是守护进程可能需要很长时间才能关闭,在最坏的情况下甚至可能需要一分钟以上。

4

4 回答 4

1

应用程序重启的方式基本上有以下三种:

  1. 当应用程序被告知重新启动时,它会进行适当的清理,释放它分配的所有资源,然后像从头开始一样重新初始化。

  2. fork 一个新进程,新的子进程执行自己,父进程正常退出。

  3. 守护进程实际上只是一个包装应用程序,很像一个初始化脚本。它派生了一个运行实际应用程序的新进程,而父进程只是等待它退出。如果子进程(和真正的应用程序)返回一个特殊的退出代码,这意味着它应该重新启动,以便重新开始 forks/execs。

请注意,第 2 点和第 3 点基本相同。

于 2014-04-24T14:09:55.937 回答
1

将重新启动分解为两个步骤,停止和启动。如果你的程序需要时间停止,它应该在停止函数中处理,我不能评论细节,因为我不知道你的用例,但我想监控进程以检查它是否被终止将是一个优雅的停止的方法

于 2014-04-24T14:12:54.287 回答
1

做任何你需要做的关闭/清理,然后调用这个:

execl( argv[0], argv, reinterpret_cast< char* >( 0 ) );

就像 fork() 和 exec(),但跳过了 fork。exec 将用自己的新副本替换当前进程。参看。http://linux.die.net/man/3/exec

于 2014-04-24T14:18:29.190 回答
0

您的 init 脚本应该只是杀死您的守护程序并重新启动它。不要尝试从您的守护程序重新启动您的守护程序。

于 2014-04-24T14:03:55.900 回答