我开发了一个应用程序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-service
在while ! /usr/bin/mysvc ... ; do echo "Restart" ; done
脚本中解决它,但我想知道是否有可能用C语言来处理它(程序已经处理了退出,重新加载配置,等)。