守护进程是一个后台进程,它无需用户输入就能运行,经常是提供某种服务。
LInux作为服务器,主要的进程也都是为系统或用户提供后台服务功能。
常见的守护进程有Web服务器、邮件服务器以及数据库服务器等等。
守护进程不能够控制终端,所以任何输入或者输出都需要做特殊处理。
守护进程程序的名字默认规则需要以d字母结尾

守护进程看上去似乎很神秘,但如果牢记几条规则而且知道几个关键函数,工作就很简单了。
首先执行fork后让父进程退出。
和多数程序一样,一个守护进程是从shell脚本或者命令行启动的。
但守护进程和应用程序不一样,因为他们不是交互式的,他们在后台因而没有控制终端。
父进程在fork子进程退出后就消除了控制终端。
守护进程既不需要从标准输入设备读信息,也不需要从标准输出设备输出信息。

下一步是在子进程中调用setsid,取消进程和任何控制终端的关联。
下一步是让根目录成为子进程的当前工作目录。
因为任何进程如果他的当前目录是在一个被安装的文件系统上,那么就会妨碍这个文件系统被卸载。

接下来设置进程的umask为0。
为了避免守护进程集成的umask收到创建文件和目录操作的干扰,这一步是必要的。
如果一个进程集成了父进程的umask 055,它屏蔽掉了group和other的读和执行权。如果守护进程接着创建了一个文件,那么对group和other用户操作这个文件会带来麻烦。
守护进程调用umask 0避免了这种情况,当创建文件的时候给予守护进程更大的灵活性。

最后关闭子进程继承的任何不必要的文件描述符。
对于子进程来说,没有理由保持从父进程继承的被打开的文件描述符
具体关闭哪些取决于具体的守护进程需要和要求,很难精确的说明规则。

创建守护进程步骤总结
--父进程中执行fork后,执行exit退出。
--在子进程中调用setsid。
--让根目录"/"成为子进程的工作目录。
--把子进程的umask变为0(子进程会继承父进程的umask,所以如果在父进程中设置了umask,子进程可以不必设置)。
--关闭任何不需要的文件描述符。

setsid函数
pid_t setsid(void)
setsid函数创建一个新会话和一个新进程组,然后守护进程成为新会话的会话领导,以及新进程组的进程组领导。
setsid调用还保证新会话没有控制终端。
如果调用进程已经是一个进程组的领导进程,setsid调用失败。
setsid调用成功返回新会话ID,失败返回-1,并设置errno。
setsid调用只能够调用一次。
setsid函数实现了与控制台脱离关系,控制台关闭将不会影响守护进程。

chdir函数
int chdir(const char *pathname)
chdir函数根据参数pathname设置当前工作。
chdir调用成功返回0,失败返回-1,并设置errno。
强调:当前工作目录是指在哪个目录下执行该程序的那个目录,并不一定是该程序文件所在的目录。

umask函数
mode_t umask(mode_t mask);
umask调用把守护进程的umask设置为0,这样取消了来自父进程的umask,它们能够潜在的干扰创建文件和目录(umask函数一般是来设置文件权限的,不设置umask,有可能创建的文件其他用户无法操作)

syslog系统日志
一旦系统调用setsid,他就不再有控制终端。
可以通过syslog提供服务,记录守护进程的各种输出信息。
openlog函数打开系统日志,syslog写入日志,closelog关闭系统日志。
void open(const char *ident,int option,int facility);
void syslog(int priority,const char *format);
void closelog(void);
openlog函数发起到系统日志服务器的连接,参数ident是要向没个消息加入的字符串,典型的情况是要设置成程序的名称
参数option是下面一个或多个值
LOG_CONS    如果系统日志服务器不能用,写入控制台
LOG_NDELAY    立刻打开链接,正常情况下,直到发送第一条信息才打开连接
LOG_PERROR    打开输出到stderr
LOG_PID            每条信息中包含进程PID参数facitity指定程序发送消息的类型
LOG_AUTHPRIV    安全授权消息
LOG_CRON    时钟守护进程:cron和at
LOG_DAEMON    其他系统守护进程
LOG_KERN    内核消息
LOG_LPR        打印机子系统
LOG_MAIL    邮件子系统
LOG_USER    默认参数priority指定消息的重要性
LOG_EMERG    系统不能使用
LOG_ALERT    立即采取措施
LOG_CRIT    紧急事件
LOG_ERR        出错条件
LOG_WARNING    警告条件
LOG_NOTICE    正常但重大事件
LOG_INFO    信息消息
LOG_DEBUG    调试信息syslog代码例子:
syslog("LOG_INFO","my daemin is ok");
严格的说,openlog和closelog是可选的,因为函数syslog在首次使用的时候自动打开日志文件。
Linux系统上日志文件通常是/var/log/messages。

和一个守护进程通信,你需要向它发送信号,让它以某种方式响应。
例如:强行要求一个守护进程重新读取它的配置文件,或者改变守护进程的行为,或者指示守护进程结束运行。

通过shell脚本结束守护进程,shell脚本写完后需要修改脚本属主可执行权限

shell脚本解释#!/bin/sh    用这个命令来执行脚本文件。WHOAMI=`whoami`        定义一个变量WHOAMI(变量名一般大写);`whoami`双反单引号表示在命令行执行whoami命令,并且将结果保存在变量WHOAMI中

PID=`ps -u $WHOAMI | grep tecd | awk '{print $1}'` 执行命令,并且将命令结果作为变量PID的值,ps -u $WHOAMI  获取当前用户的进程列表grep tecd    在列表中查找tecd这个字符串,并返回带有这个字符串的记录列表awk            获取一条信息的某部分print $1            获取这条信息的第一列数据,$2获取这条信息的第二列数据
if( test "$PID" != "") thenkill -s 2 $PID
fi

启动守护进程shell脚本

#!/bin/shWHOAMI=`whoami`PID=`ps -u $WHOAMI | grep tecd | awk '{print $1}'`if(test "$PID" = "") then./tecd
fi

关闭守护进程shell脚本

#!/bin/sh   WHOAMI=`whoami`        PID=`ps -u $WHOAMI | grep tecd | awk '{print $1}'`if( test "$PID" != "") thenkill -s 2 $PID
fi

Linux 守护进程一相关推荐

  1. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...

  2. .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

    几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程.NET跨平台实践:再谈用C#开发Linux守护进程 - 完整篇 这就是本文 ...

  3. Linux守护进程实现

    Linux守护进程 redis版: void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); ...

  4. linux网络编程一:主机字节序与网络字节序的的判断

     linux网络编程一:主机字节序与网络字节序的的判断(1)现代CPU的累加器一次能装载至少4字节(32位),即一个整数.那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数值,这就是字节序问题 ...

  5. Linux 命令详解(六)Linux 守护进程的启动方法

    Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

  6. .NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇

    Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展 ...

  7. .NET跨平台实践:用C#开发Linux守护进程

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  8. 深入理解Linux守护进程

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

  9. Linux守护进程的创建(结合nginx框架)

    Linux守护进程的创建(结合nginx框架) 先介绍几个相关函数: int dup2(arg1,arg2):参数一指向的内容赋给参数二,shi的参数二也能访问参数一所指向的内容,并返回新的描述符 i ...

最新文章

  1. cf两边黑屏怎么解决win10_Win10电脑开机黑屏只有鼠标指针无法进入桌面的解决方法...
  2. 云安全与我们未来的网络息息相关……
  3. 图灵奖得主吐槽中国高校「重科研,轻教育」怪象!高校教师评价体系是元凶?...
  4. mxnet 和pytorch比较
  5. Cannot evaluate tensor using 'eval' No default session is registered错误问题的解决
  6. 关于Django的时区设置TIME_ZONE,USE_TZ的问题
  7. docker如何部署python项目_Docker如何部署Python项目的实现详解
  8. 吴功宜计算机网络教程ppt,计算机网络 吴功宜 编著ppt课件.ppt
  9. guided Filter--引导滤波算法原理及实现
  10. 面试机试之序列前n项和
  11. ESP32 LVGL8.1 ——Label 标签 (Style 14)
  12. 手机解开加密excel表格xlsx,忘记excel表格xlsx密码如何找回?
  13. 运行在WEB上的电子海图数据
  14. 新版标准日本语初级_第四十五课
  15. C语言数据结构猜数小游戏
  16. oracle分时分段表示,管理信息系统试题及答案三套.doc
  17. ecshop后台出现Strict Standards: Only variables should be passed by refin /var/www·····
  18. Linux命令之ssh基本用法
  19. Linux安装Git(真的超简单)
  20. Python+matplotlib实现填充螺旋实例

热门文章

  1. 十二种特征工程相关技术简介
  2. 麻省理工学院开发出可“听音识貌”的人工智能
  3. 科学家王海峰:从百度十篇论文入选ACL 2019说起
  4. 比较好的中文分词方案汇总推荐
  5. AI公司为什么集体造“芯”?寻求商业变现新途径
  6. AutoX李卓:无人驾驶市场是渐进式的,但技术其实很难渐进式
  7. 赋能AI开源生态,Tengine成AI开发利器
  8. 美权威报告:量子计算十年内无法落地
  9. SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空!
  10. Tensorflow— name/variable_scope