【问题标题】:how to stop a daemon如何停止守护进程
【发布时间】:2012-09-20 17:08:20
【问题描述】:

我正在将文件作为守护进程执行。如何停止守护进程?

int main(int argc, char **argv)
{
    if ( argc != 5 )
    {
        printf ("Usage: %s <server> <nick> <channel> <logging>\n", argv[0]);
        return 1;
    }       
    char *startPath =  malloc(sizeof(char) *100);

strcpy(startPath,"/home/.../start");    

int child_pnr;

if(daemonisieren() != 0) 
{
    printf("damonization not possible");
    exit(0);
}   

printf("I am a damon \n");

 if((child_pnr = fork())==0)
{       
    execve(startPath,argv); 
}
else if (child_pnr > 0)
{   
    printf("I am parent and have a child \n");
    wait(child_pnr);
 }

printf("gone....\n");

free(startPath);
}

我想我可以像 kill(childnr) 一样杀死它,但是当父进程等待子进程完成执行时,他可能永远不会这样做,我必须有一个知道 childnr 并杀死它的程序。我该怎么做?

【问题讨论】:

    标签: c linux ubuntu


    【解决方案1】:

    您可以使用许多不同的方法使孩子的进程号可用,所有这些方法都可以有效。一种简单的方法是将其存储到系统上的文件中。如果您查看/var/run,您可能会发现许多 XXX.pid 文件已经这样做了。

    对于您的用例,也许一个更好的解决方案是在您的父级中启动一个新线程(或让它派生第二个孩子),该线程执行一段时间的睡眠,如果该时间过去,它会杀死主要孩子.如果主子进程自行终止,满足父进程的等待,父进程可以杀死“看门狗”子进程(或线程)。

    【讨论】:

    • 谢谢...第二种方法很好,但程序可能会运行几个小时...不知道多长时间...第一种还可以,但是如果我想阅读在 /var/run 我需要有我的应用程序可能没有的 root...
    • 位置 /var/run 很方便(并且合适),如果你当然可以在那里写的话,但是这个位置并没有什么魔力......任何你有写权限的地方都应该没问题。至于看门狗并运行几个小时,一个线程(man pthread_create 初始细节)将非常轻量级。
    • @Fendrix,当你想杀死子进程时,你有什么标准?如果你向你的父进程发送一个信号,wait 会返回一个错误并将 errno 设置为 EINTR。因此,如果父进程收到信号,您可以使用该事实并 kill() 子进程。
    • 好的..我认为孩子启动的应用程序类似于服务器......这意味着它运行数小时,数天......例如apache ......你可以像 xxxx -stop 一样阻止他......我想在我的情况下做同样的事情
    • 有了这个新的描述,我建议您的孩子创建一个名为 semaphore 的 posix(linux.die.net/man/7/sem_overview -- 请参阅 sem_open 来创建它)并有一个线程阻塞等待该信号量被发布。当另一个进程(相同的二进制文件,基于命令行执行操作)发布信号量时,线程将解除阻塞并执行任何操作以有序关闭您的应用程序。