Linux 守护进程一
守护进程是一个后台进程,它无需用户输入就能运行,经常是提供某种服务。 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 守护进程一相关推荐
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...
- .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计
几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程.NET跨平台实践:再谈用C#开发Linux守护进程 - 完整篇 这就是本文 ...
- Linux守护进程实现
Linux守护进程 redis版: void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); ...
- linux网络编程一:主机字节序与网络字节序的的判断
linux网络编程一:主机字节序与网络字节序的的判断(1)现代CPU的累加器一次能装载至少4字节(32位),即一个整数.那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数值,这就是字节序问题 ...
- Linux 命令详解(六)Linux 守护进程的启动方法
Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html
- .NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇
Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展 ...
- .NET跨平台实践:用C#开发Linux守护进程
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
- 深入理解Linux守护进程
深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daem ...
- Linux守护进程的创建(结合nginx框架)
Linux守护进程的创建(结合nginx框架) 先介绍几个相关函数: int dup2(arg1,arg2):参数一指向的内容赋给参数二,shi的参数二也能访问参数一所指向的内容,并返回新的描述符 i ...
最新文章
- cf两边黑屏怎么解决win10_Win10电脑开机黑屏只有鼠标指针无法进入桌面的解决方法...
- 云安全与我们未来的网络息息相关……
- 图灵奖得主吐槽中国高校「重科研,轻教育」怪象!高校教师评价体系是元凶?...
- mxnet 和pytorch比较
- Cannot evaluate tensor using 'eval' No default session is registered错误问题的解决
- 关于Django的时区设置TIME_ZONE,USE_TZ的问题
- docker如何部署python项目_Docker如何部署Python项目的实现详解
- 吴功宜计算机网络教程ppt,计算机网络 吴功宜 编著ppt课件.ppt
- guided Filter--引导滤波算法原理及实现
- 面试机试之序列前n项和
- ESP32 LVGL8.1 ——Label 标签 (Style 14)
- 手机解开加密excel表格xlsx,忘记excel表格xlsx密码如何找回?
- 运行在WEB上的电子海图数据
- 新版标准日本语初级_第四十五课
- C语言数据结构猜数小游戏
- oracle分时分段表示,管理信息系统试题及答案三套.doc
- ecshop后台出现Strict Standards: Only variables should be passed by refin /var/www·····
- Linux命令之ssh基本用法
- Linux安装Git(真的超简单)
- Python+matplotlib实现填充螺旋实例
热门文章
- 十二种特征工程相关技术简介
- 麻省理工学院开发出可“听音识貌”的人工智能
- 科学家王海峰:从百度十篇论文入选ACL 2019说起
- 比较好的中文分词方案汇总推荐
- AI公司为什么集体造“芯”?寻求商业变现新途径
- AutoX李卓:无人驾驶市场是渐进式的,但技术其实很难渐进式
- 赋能AI开源生态,Tengine成AI开发利器
- 美权威报告:量子计算十年内无法落地
- SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空!
- Tensorflow— name/variable_scope