一、什么是守护进程
守护进程的引入
现实中许多大小的服务器或者软件必须保证7*24小时无障碍运行,例如百度搜索引擎等,这些一直运行的程序怎么实现的呢? 本质就是守护进程
守护进程的定义
守护进程是运行在后台的一种特殊进程,独立于控制终端并且周期性的执行某种任务或处理某些突发事件。
Linux的大多数服务器是守护进程实现的,比如Web服务器httpd,Internet服务器inetd。
守护进程的特点
Linux系统启动时会启动很多系统服务进程,
1、这些进程不能直接和用户交互,
2、脱离终端并且在后台运行,
3、不受用户登录和注销的影响,一直运行。
4、守护进程自成进程组,自成会话
二、守护进程的创建
1、查看系统中的进程
ps axj
a:所有进程
x: 显示控制终端的进程和无控制终端的进程
j : 列出与作业控制相关的信息
TPGID 一列 -1 表示为不受终端控制的进程也就是守护进程
COMMAND 一列 【】表示内核线程,这些线程在内核创建,没有用户空间代码,因此没有程序文件名和命令行
2、setsid函数
创建新会话
//调用setsid函数创建一个新的Session并成为Session Leader
#include<unistd.h>
pid_t setsid(void);
返回值: 调用成功返回新创建的Session的id,出错返回-1
2》注意:调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1
解决方法:先fork出子进程,在子进程中调用setsid(进程组的第一个进程是Leader,子进程必然不是进程组的Leader)
调用系统函数daemon创建守护进程
#include<unistd.h>
int daemon(int nochdir, int noclose);
1、daemon函数用户脱离控制台,以守护进程的形式在后台运行
2、nochdir为0,daemon将更改当前进程的目录为根目录
3、noclose为0,进程的STDIN,STDOUT,STDERR,写入的所有数据直接丢弃
#include<unistd.h>
#include<stdio.h>
int main()
{
daemon(1,1); //创建守护进程
while(1);
return 0;
}
三、如何杀死守护进程?
1、ps axj | grep 守护进程名字 找到对应的进程id kill -9 进程id
2、创建shell脚本对进程的启动、关闭、重启进行自动管理