使用systemb过程

来源:互联网 发布:瑞珀网络机顶盒升级包 编辑:程序博客网 时间:2024/05/21 12:40

这是在公司做巴西项目的时候,公司要求实现systemb的加载方式,国内使用这种方式还不多,多为国外公司使用!

1、最开始接触systemb这个名词时,并不懂这个东西有什么用处!开始通过查找http://fedoraproject.org/wiki/Systemd/zh-cn

和http://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/以及https://blog.linuxeye.com/400.html
网址了解到systemd替换了SysInit启动项。
Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动
过程中更有效地引导加载服务。(通过该网页的一句话“systemd 无需经过任何修改便可以替代 sysvinit 。”
为下文的失败埋下伏笔)




2.由于上文中无需任何修改,所以http://www.freedesktop.org/software/systemd/man/systemd.service.html
网页中仅仅通过(Example 1. Simple service)中简单的例子写了一个配置文件:WdkmgrServer.service
[Unit]
Description=Watchdata USB Key 


[Service]
ExecStart=/usr/bin/WdkmgrServer


[Install]
WantedBy=multi-user.target


但是,在linux系统中从新启动时(通过systemctrl status WdkmgrServer.service命令)发现所要启动的服务
仅仅启动了子进程,而父进程并没有启动。




3.然后动手编译了一个小程序,该程序中仅有一个进程,该进程也是仅有一个死循环来输出日志信息。更改
配置文件中启动项的名称ExecStart=/usr/bin/hello。
程序如下:
#include <syslog.h>
int main()
{
while(1)
{
syslog(LOG_DEBUG, "in hello\n");
sleep(5);
}
return 0;
}




重新启动系统,通过ps -ef | grep hello命令发现,hello这个进行已经自启动了,与猜想吻合。
4.继续向小程序中添加代码,实现父进程与子进程输出日志信息。(仅添加了一个fock()函数),重新启动
该系统,结果发现仅仅启动的子进程,父进程没有启动。
程序如下:
#include <syslog.h>
#include <unistd.h>
#include <stdlib.h>


int main()
{
pid_t pid;


if (0 > (pid = fork())) {
syslog(LOG_DEBUG, "fork failed\n");
} else if (0 < pid) { //parent process
syslog(LOG_DEBUG, "ready to exit parent\n");
exit(0);
} else { // child process
//do nothing
syslog(LOG_DEBUG,"version 1.0\n");
}


while(1)
{
syslog(LOG_DEBUG, "in hello\n");
sleep(5);
}
return 0;
}


5.由此可见,问题一定出现在fock()这个函数上,通过
搜索fock systemb这两个关键字,发现这个网页http://www.freedesktop.org/software/systemd/man/systemd.service.html
中的(Example 1. Simple service)中并不适用于fock这个函数。持续向下看发现(Example 4. Traditional forking services
)很适合本程序。




6.通过在配置文件:WdkmgrServer.service添加
[Unit]
Description=Some simple daemon


[Service]
Type=forking
ExecStart=/usr/sbin/hello -d


[Install]
WantedBy=multi-user.target


重新启动系统,通过命令(ps -ef | grep hello)发现进程已经启动,通过(systemctrl status WdkmgrServer.service)
发现程序正在运行状态,与猜想吻合。




7.将该配置文件用在项目中,服务成功自启动。




结论:文章开始处“systemd 无需经过任何修改便可以替代 sysvinit”这句话本身没有错误,但是不能了解
错误,也就是说配置文件是通过源代码写配置文件,当源代码存在fock()函数新建立一个新的进程时,就需要考虑定义自启动项
的类型。

0 0
原创粉丝点击