1、概念:守护进程是在后台运行的不受终端控制的进程,通常守护进程在系统启动时自动运行,守护进程的名称通常以d结尾,比如sshd、xinetd、crond等。

2、创建守护进程的步骤:
a、调用fork(),创建新进程,它会是将来的守护进程;
b、在父进程中调用exit(),保证子进程不是进程组组长;(进程组组长不能创建新的会话)
c、调用setsid创建新的会话期; pid_t  setsid(void); 如果调用进程不是进程组组长,就可以创建一个新的会话期。调用者进程号码称为会话期的号码,和会话期中唯一进程组的号码
d、将当前目录改为根目录;
e、将标准输入、标准输出、标准错误重定向到/dev/null;

 #include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<signal.h>
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0) //宏要求一条语句 int setup_daemon(void);
int main()
{
setup_daemon();
   for(;;);
//实际上直接调用daemon()函数也可以实现。
//void daemon(int nochdir,int noclose); nochdir:0将当前目录更改至"/"
//noclose:0 将标准输入、标准输出、标准错误重定向到/dev/null
//printf("test...");//没有输出
return 0;
}
//创建完新会话,调用者进程将成为新会话期的领头进程;
//调用者进程会成为新会话中唯一进程组的组长;
//并且新的会话期没有控制终端;在后台运行;
int setup_daemon(void)
{
pid_t pid;
pid=fork();
if(pid==-1)
ERR_EXIT("fork error");
else if(pid>0)
exit(EXIT_SUCCESS);
setsid();
chdir("/");
close(0);
close(1);
close(2);
open("/dev/null",O_RDWR);//0指向/dev/null
dup(0);//找到最小的1指向0
dup(0);//找到最小的2指向0
return 0;
}
  实际系统中提供了一个函数,实现上述功能:void daemon(int nochdir,int noclose);的参数都置为1,就不会重定向,也不会定位到根目录,主要用于开发调试的时候使用。


在 Debian 系统中, start-stop-daemon 就是为将一个普通程序变成守护进程而生。

  • -b, --background 通过 fork 和 setsid 的形式将程序变为后台运行。
  • -d, --chdir 更改进程的工作目录。
  • -u, --user 设置进程的执行用户。
  • -k, --umask 设置新建文件的权限掩码。

除此之外, start-stop-daemon 还可以

  • -S, --start 启动程序
  • -K, --stop 给程序发信号,终止程序或者判断程序的状态都可以

并且还通过 -p, --pidfile 和 -m, --make-pidfile 在启动程序时将守护进程启动后的 pid 写入指定文件,方便后续的终止程序或者判断程序的状态。

因为有了 start-stop-daemon 可以很容易写出系统启动脚本,网上的例子很多,比如这个

在我们的工作中,接触了很多守护进程(daemon),比如 Web Server (Apache,Nginx),MySQL,Redis,Memcached 等等。除了这些开源程序,我们自己也会开发一些守护进程以满足业务的需要,比如UU加速节点上的 Echo Server 用来给玩家客户端提供测速服务。那么此时,我们需要特别关心的是:一个完整的守护进程需要满足哪些特性,以及如何实现这些特性。

首先谈谈我们对于守护进程的要求和期望的特性:

  • 后台 运行。
  • 不会随着创建该守护进程的会话退出后,守护进程也跟着退出,要能 7x24 小时运行哇!
  • 不能具有控制终端。杜绝从控制终端接收标准输入,还输出日志到控制终端。

在 《Advanced Programming in the UNIX Envrioment》一书中的 Chapter 13.Daemon Process ,就详细介绍 daemon 的编程规则和实现:

  • 调用 fork 后,主进程退出,子进程忽略HUP信号。这样不仅能后台运行,还能忽略HUP信号,保证 7x24 小时运行。
  • 调用 setsid 以创建一个新会话,使得调用进程:
    • 成为新会话的首进程
    • 成为新进程组的组长进程
    • 没有控制终端

这些操作可以使得一个程序满足了我们对于守护进程的期望,但是还远远不够,还需要:

  • 调用 umask 设置权限掩码,保证守护进程创建新文件的权限。
  • 调用 chdir 设置守护进程的工作目录。
  • 调用 setuid 和 setgid 设置守护进程的用户。
  • 关闭从父进程继承的不再需要的文件描述符。

如果在我们的代码中去实现一个守护进程,确实费心费力。所以大家都在寻找如何将我们的一个简单的程序变成守护进程?在UU加速节点中,启动 Echo Server 守护进程时,比较粗暴的通过以下命令:

nohup command 2>&1 >> log &

这样的命令仅仅实现了后台运行和不随会话退出而提出,不仅很多细节没有实现,并且不够优雅。在 Debian 系统中, start-stop-daemon 就是为将一个普通程序变成守护进程而生。

  • -b, --background 通过 fork 和 setsid 的形式将程序变为后台运行。
  • -d, --chdir 更改进程的工作目录。
  • -u, --user 设置进程的执行用户。
  • -k, --umask 设置新建文件的权限掩码。

除此之外, start-stop-daemon 还可以

  • -S, --start 启动程序
  • -K, --stop 给程序发信号,终止程序或者判断程序的状态都可以

并且还通过 -p, --pidfile 和 -m, --make-pidfile 在启动程序时将守护进程启动后的 pid 写入指定文件,方便后续的终止程序或者判断程序的状态。

因为有了 start-stop-daemon 可以很容易写出系统启动脚本,网上的例子很多,比如这个 https://gist.github.com/alobato/1968852#file-start-stop-example-sh 。

start-stop-daemon在Debian系的Linux发行版中都是默认自带的。但在Redhat系Linux发行版中却没有该工具,我们可以自行安装:

wget -c http://developer.axis.com/download/distribution/apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz
tar -xzf apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz
cd apps/sys-utils/start-stop-daemon-IR1_9_18-2
gcc start-stop-daemon.c -o start-stop-daemon

切换到root下
cp start-stop-daemon /sbin/
chmod +x /sbin/start-stop-daemon

守护进程详解以及start-stop-daemon命令的更多相关文章

  1. linux系统编程之进程(八):守护进程详解及创建,daemon()使用

    一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...

  2. linux系统编程:守护进程详解及创建,daemon()使用

    一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...

  3. 守护进程详解及创建,daemon()使用

    一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而 且提供某种服务,不是对整 ...

  4. Linux学习之守护进程详解

    Linux系统守护进程详解                                                              ---转自:http://yuanbin.blog ...

  5. Linux守护进程详解(init.d和xinetd) [转]

    一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台 的守护进程来执行的 ...

  6. Linux守护进程详解(init.d和xinetd)

    一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程来执行的. ...

  7. Linux系统守护进程详解ntsysv 可以关掉那些服务

    acpid, haldaemon, messagebus, klogd,network, syslogd  以上几个服务必须开启!其他的分析如下: 1.NetworkManager,NetworkMa ...

  8. kibana启动--nohup在关闭终端后无效&&守护进程详解

    https://blog.csdn.net/ty_0930/article/details/70184705 https://blog.csdn.net/Dream_Flying_BJ/article ...

  9. Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量

    Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程:    1.线程是一堆指令,是操作系统调度 ...

随机推荐

  1. rabbitmq 交换机模式 -主题模式 topic

    建立一个交换机 tpc 并且绑定了各自的路由到 Q1 Q2 <?php require_once "./vendor/autoload.php"; use PhpAmqpLi ...

  2. monolog封装

    做一下基本关于Monolog的基本介绍: Monolog是基于PHP的日志类库. 介绍就到这,言归正传 安装 安装最新版本:(composer 还没安装的~:https://www.phpcompos ...

  3. linux(centos8):安装分布式事务服务seata(file单机模式,seata 1.3.0/centos 8.2)

    一,什么是seata? Seata:Simpe Extensible Autonomous Transcaction Architecture, 是阿里中间件,开源的分布式事务解决方案. 前身是阿里的 ...

  4. ansible通过yum/dnf模块给受控机安装软件(ansible2.9.5)

    一,使用yum/dnf模块要注意的地方: 使用dnf软件安装/卸载时,需要有root权限, 所以要使用become参数 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnb ...

  5. C# Timer用法及实例讲解

    摘自:http://www.cnblogs.com/xcsn/archive/2013/05/10/3070485.html 1.C# Timer用法及实例详解 http://developer.51 ...

  6. Linux命令的执行

    为什么在提示符下命令可以被执行呢? 执行命令过程 输入命令后回车,提请shell程序找到键入命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来 shell本身也是一个程序,只不过 ...

  7. ERP仓库管理的操作与设计--开源软件诞生20

    赤龙ERP库房管理讲解--第20篇 用日志记录"开源软件"的诞生 [点亮星标]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redragon/r ...

  8. centos7 添加环境变量

    修改/etc/profile文件使其永久性生效,并对所有系统用户生效 PATH=$PATH:/usr/local/php/bin export PATH source /etc/profile

  9. 关于c++ string类的一些使用

    主要最近要用的上 才整理一下 用string类别忘了导入头文件 #include <string> 注意这个细节:cout 可直接输出 string 类的对象的内容 但是printf不可以 ...

  10. 使用ML.NET模型生成器来完成图片性别识别

    什么是ML.NET? ML.NET 使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中. 借助此功能,可以使用应用程序的可用数据进行自动预测. 机器学习应用程序利用数据中的模式来进行预测 ...