从服务本身触发服务重启

时间:2018-08-02 13:16:57

标签: c linux service embedded-linux petalinux

我开发了一个应用程序mysvc,它通过/etc/init.d/mysvc-service作为(Peta)Linux服务运行(名称应有所不同,因为它们在petalinux / yocto词汇表中是不同的“应用程序”。)

/usr/bin/mysvc通过start-stop-daemon运行:

# start()
start-stop-daemon -S -o --background -x /usr/bin/mysvc
# stop()
start-stop-daemon -K -x /usr/bin/mysvc

它嵌入了一个简单的HTTP服务器,该服务器允许重新启动/关机(正常工作),我想添加一个仅运行/etc/init.d/mysvc-service restart重启按钮(从命令行)。

当我想使用Linux /etc/init.d/系统(用于构建命令行参数等)时,我检查了another question,它重新运行了程序本身来自程序本身< / em>(即响应服务器处理的HTTP请求),因此我尝试了以下方法:

daemon()

将调用daemon(),该{基本上是fork()exit()是父进程。子进程实际上只会运行/etc/init.d/mysvc-service start

    if (daemon(1,1) == 0) { // Forks and exit() the parent. We are the child
        system("/etc/init.d/mysvc-service start"); // "start" and not "restart" because the parent process is not running anymore
        exit(0);
    } else {
        perror("daemon()");
    }

fork()

fork()并正常退出父级,而孩子将运行/etc/init.d/mysvc-service start

    switch (fork()) {
        case 0: // Child runs command and exits
            system("/etc/init.d/mysvc-service start");
            exit(0);

        case -1: // Error
            perror("fork()");
            break;

        default: // Parent process: gracefully quit
            run = false;
            break;
    }

这两个失败都具有相同的症状(因为它们在本质上是等效的):父进程退出(如预期的那样),但是mysvc /etc/init.d调用没有产生新的system()

我可以使用简单的mysvc-servicewhile ! /usr/bin/mysvc ... ; do echo "Restart" ; done脚本中解决它,但我想知道是否有可能用C语言来处理它(程序已经处理了退出,重新加载配置,等)。

0 个答案:

没有答案