如何让程序自行重启? (Linux进程)

Posted

技术标签:

【中文标题】如何让程序自行重启? (Linux进程)【英文标题】:How to make a program to restart itself? (Linux process) 【发布时间】:2012-01-08 07:04:15 【问题描述】:

我正在尝试让我的程序自行重启,但似乎没有任何效果。我尝试使用fork(),但在杀死 the parent 进程后 the child 也被杀死了。

代码

void sigup_handler(int signum) 
    int pid = fork();
    if (pid == 0) 
        execve("prog2", NULL); 
    
    else
        kill(getpid(), SIGTERM);


int main() 
    puts("Program 2 started.");
    signal(SIGHUP, sigup_handler);
    sleep(50); 
    puts("Program 2 terminated.");
    return 0;

【问题讨论】:

【参考方案1】:

如果您只是要去kill parent,为什么还要打扰fork?只需执行exec。该程序的新实例仍将是相同的进程,但将有效地重新启动。

【讨论】:

它输出程序 2 已启动。程序 2 开始。用简单的 execve("prog2", NULL);这让我很困惑。它不应该显示“程序2终止”吗? 它永远不会调用“程序 2 终止”,因为父进程已经用 kill(getpid(),...); 终止了自己; 好的,那么。不管怎样,这条消息很容易通过将它放在一个进程保证终止的地方来实现。 请注意,旧进程映像的文件描述符将保持打开状态!【参考方案2】:

使用 2 级分叉。一个家长“监控”应用程序,它分叉孩子并监控他们的状态。如果一个孩子死了,监视器就会启动一个新的。然后孩子们自己分叉做他们必须做的任何事情。

但是,如果您不需要应用程序的“新”副本与被杀死的应用程序具有相同的状态,那么使用 exec() 开始一个新的独立副本可能是一个更好的选择,可以节省您的时间必须有那个监视器副本。

【讨论】:

【参考方案3】:

您可以使用daemon(3) 后跟execve(2)

【讨论】:

您介意提供简单的代码来演示使用吗? 这当然是我所做的,但没有取得多大成功:***.com/q/51654668/1098603

以上是关于如何让程序自行重启? (Linux进程)的主要内容,如果未能解决你的问题,请参考以下文章

linux中如何重启某一进程

如何让nodejs在linux后台运行

linux中如何重启某一进程

linux程序崩溃自动重启

linux脚本里运行环境变量,不重启终端,重新登陆用户,让其一直有效,在脚本退出后,能被其他程序访问

swoole自定义进程如何热重启