标签:内核 产品 tab des 服务器系统 进程id 调试 信息 速度
原创 郝健 Linux阅码场 1月20日作者:郝健
目前就职于瑞星咖啡,负责4层负载均衡的研究与开发。曾就职于天融信,赛尔网络,云杉网络几家公司。主要感兴趣的方向:linux内核网络子系统,dpdk。
目前,Linux平台下主流的服务程序启动管理方式有以下几种:
守护进程是在后台运行不受控端控制的进程,通常情况下守护进程在系统启动时自动运行。
1.1 概念说明
进程组
每个进程除了有一进程ID( PID )之外,还属于一个进程组。进程组是一个或多个进程的集合。每个进程组有一个唯一的进程组ID( PGID )。进程组ID类似于进程ID, 它是一个正整数,并可存放在pid_t数据类型中。函数getpgrp返回调用进程的进程组ID。
会话期(session)
会话期是一个或多个进程组的集合。通常是由shell的管道将几个进程编成一组的。比如,下图中的安排 可能是由下列形式的shell命令形成的:
procl | proc2 &
proc3 | proc4 | proc5
一般,登陆一个shell时就会创建一个会话期。进程调用setsid函数就可建立一个新会话期。
如果调用此函数的进程不是一个进程组的组长,则此函数创建一个新会话期,结果为:
此进程变成该新会话期的会话期首进程(session leader,会话期首进程是创建该会话期的进 程)。此进程是该新会话期中的唯一进程。
此进程成为一个新进程组的组长进程。新进程组ID是此调用进程的进程ID。
控制终端(terminal)
会话期和进程组有一些其他特性:
1.2 创建方法
创建守护进程,应该创建一个进程然后将其放到一个新的会话期中。
或者直接调用daemon函数
sysvinit主要依赖于Shell脚本,在/etc/rc.d/rc*.d建立软连接。在RedHat系列发行版中,还提供了 service,chkcon?g 等命令行工具,来方便来管理 init 系统。sysvinit的主要问题是启动慢,已经逐渐 被淘汰。
目前Ubuntu和Centos等主流发行版都以移步到systemd,但仍然兼容老的写法,这里简单举个的例 子,编写一个simple脚本,添加执行权限后,保存到/etc/init.d/目录下。
测试:
systemd是目前主流Linux发型版采用的init项目,systemd起初饱受争议,可以搜索“the software that currently breaks your audio”查看。但随着越来越稳定和使用c开发,高效启动,已经逐渐成为主角。Linus也表示:Torvalds says he has no strong opinions on systemd
我们简单实现一个simple-server来感受一下systemd,主要步骤如下:
1. 编写一个需要作为守护的程序,如:simple-server.c
2. 编写service文件
具体的说明详见;
https://www.freedesktop.org/software/systemd/man/systemd.service.html
其中Restart=always代表在任何情况下service被杀死后,都需要自动重启,其他说明详见如上链接中的 Table 2。
3. sudo cp simple-server.service /lib/systemd/system
4. sudo systemctl enable simple-server 设置为开机启动,会自动创建软连接 /etc/systemd/system/multi-user.target.wants/simpleserver.service -> /lib/systemd/system/simple-server.service
5. sudo systemctl start simple-server 启动
6. sudo systemctl status simple-server 查看状态
7. cat /var/log/syslog 查看日志输出
8. pstree | grep simple-server
9. sudo killall simple-server 杀死服务,验证是否自动重启。
几点说明:
一个terminal一旦关闭,其绑定的shell会收到SIGHUP信号,且shell在退出之前会将SIGHUP信号广播 给其上的进程组,即其上所有进程都会退出。这也是自daemon需要调用setsid脱离terminal的原因。nohup命令并不是真正脱离terminal,而是忽略SIGHUP。将标准输入重定向到/dev/null,标准输出和标准出错重定向到nohup.out,且不会随着terminal的关闭而退出。验证:
1)正常启动一个死循环程序
2)nohup启动同样的死循环程序
综上,systemd看起来可以满足一个产品级别服务程序的两个最重要的需求:根据不同情况重启;记录 日志灵活可查,而这是daemon和nohup方式无法快速方便满足的。sysvinit简单清晰,但启动慢,就作为传统运维人员的美好记忆保留吧。
标签:内核 产品 tab des 服务器系统 进程id 调试 信息 速度
原文地址:https://blog.51cto.com/15015138/2555438