您的位置:首页 > 其它

使用systemb过程

2015-11-07 12:55 246 查看
这是在公司做巴西项目的时候,公司要求实现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()函数新建立一个新的进程时,就需要考虑定义自启动项

的类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: