使用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()函数新建立一个新的进程时,就需要考虑定义自启动项
的类型。
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()函数新建立一个新的进程时,就需要考虑定义自启动项
的类型。
相关文章推荐
- 2015 CCPC C题(超时代码)
- ubuntu下手把手教你搭建SVN服务器
- Pahom on Water(最大流)
- 基于js与flash实现的网站flv视频播放插件代码
- 电源调试记录五
- POJ3126 (bfs)
- recyclerview设置布局样式
- Java线程池及Future、Callable获得线程返回结果【Java线程池系列2】
- SET Transaction Isolation Level Read语法的四种情况
- gulp-jade报错unexpected token:punc {{}}}与ng-annotate报错error parse
- HDU 4501 3重01背包
- 第一次用字符串
- hdu 1171 Big Event in HDU (01背包)
- codeforces-479B-Towers
- html5兼容IE
- 安装最新的qt5.5.1,在使用qmake -v 出现qmake -v could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No su
- 安全参透之旅第3章 Metasploit工具 第一节
- CCPC 2015 A题
- 逆水行舟问题
- Linux Scheduling Domains