热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux进程管理linux守护进程深入理解

一常用命令ps参数讲解使用ps命令查看进程的当前状态,其中STAT列的含义如下:D不可中断的休眠。通常是IO。R运行。正在运行或者在运行队列中等待。S

一 常用命令 ps 参数讲解

使用ps命令查看进程的当前状态&#xff0c;其中STAT列的含义如下&#xff1a;D 不可中断的休眠。通常是IO。R 运行。正在运行或者在运行队列中等待。S 休眠。在等待某个事件&#xff0c;信号。T 停止。进程接收到信息SIGSTOP&#xff0c;SIGSTP&#xff0c;SIGTIN&#xff0c;SIGTOU信号。W paging&#xff0c;在2.6之后不用。X 死掉的进程&#xff0c;不应该出现。Z 僵死进程。通常还会跟随如下字母表示更详细的状态。<高优先级N 低优先级L 有pages在内存中locked。用于实时或者自定义IO。s 进程领导者&#xff0c;其有子进程。l 多线程&#43; 位于前台进程组。还有一些其他不常见的状态。


二 理论 

原文&#xff1a;http://blog.163.com/yungang_z/blog/static/175153133201232462140622/

      守护进程&#xff08;Daemon&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进 程。Linux的大多数服务器就是用守护进程实现的。比如&#xff0c;Internet服务器inetd&#xff0c;Web服务器httpd等。同时&#xff0c;守护进程完成许多系统任务。 比如&#xff0c;作业规划进程crond&#xff0c;打印进程lpd等。

        守护进程的编程本身并不复杂&#xff0c;复杂的是各种版本的Unix的实现机制不尽相同&#xff0c;造成不同 Unix环境下守护进程的编程规则并不一致。需要注意&#xff0c;照搬某些书上的规则&#xff08;特别是BSD4.3和低版本的System V&#xff09;到Linux会出现错误的。下面将给出Linux下守护进程的编程要点和详细实例。

一&#xff0e; 守护进程及其特性

        守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次&#xff0c;守护进程必须与其运行前的环境隔离开来。这些环 境包括未关闭的文件描述符&#xff0c;控制终端&#xff0c;会话和进程组&#xff0c;工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程&#xff08;特别是shell&#xff09;中继承下 来的。最后&#xff0c;守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动&#xff0c;可以由作业规划进程crond启动&#xff0c;还可以由用户终端&#xff08;通常是 shell&#xff09;执行。

        总之&#xff0c;除开这些特殊性以外&#xff0c;守护进程与普通进程基本上没有什么区别。因此&#xff0c;编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。如果对进程有比较深入的认识就更容易理解和编程了。

二&#xff0e; 守护进程的编程要点

        不同Unix环境下守护进程的编程规则并不一致。所幸的是守护进程的编程原则其实都一样&#xff0c;区别在于具体的实现细节不同。这个原则 就是要满足守护进程的特性。同时&#xff0c;Linux是基于Syetem V的SVR4并遵循Posix标准&#xff0c;实现起来与BSD4相比更方便。编程要点如下&#xff1b;

1. 在后台运行。

        为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止&#xff0c;让Daemon在子进程中后台执行。

    if(pid&#61;fork())

exit(0); //是父进程&#xff0c;结束父进程&#xff0c;子进程继续

2. 脱离控制终端&#xff0c;登录会话和进程组

        有必要先介绍一下Linux中的进程与控制终端&#xff0c;登录会话和进程组之间的关系&#xff1a;进程属于一个进程组&#xff0c;进程组号&#xff08;GID&#xff09;就是进程组长的进程号&#xff08;PID&#xff09;。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 控制终端&#xff0c;登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们&#xff0c;使之不受它们的影响。方法是在第1点的基础上&#xff0c;调用setsid()使进程成为会话组长&#xff1a;

    setsid(); //设置为会话组长

        说明&#xff1a;当进程是会话组长时setsid()调用失败。但第一点&#xff08;fork()&#xff09;已经保证进程不是会话组长。setsid()调用成功后&#xff0c;进程成为新的会话组长和新的进程组长&#xff0c;并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性&#xff0c;进程同时与控制终端脱离。

3. 禁止进程重新打开控制终端

        现在&#xff0c;进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端&#xff08;再fork一次&#xff09;&#xff1a;

if(pid&#61;fork()) 

    exit(0); //结束第一子进程&#xff0c;第二子进程继续&#xff08;第二子进程不再是会话组长&#xff09;

4. 关闭打开的文件描述符

        进程从创建它的父进程那里继承了打开的文件描述符。如不关闭&#xff0c;将会浪费系统资源&#xff0c;可能会造成进程所占用的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们&#xff1a;

for(i&#61;0;i <3; &#43;&#43;i)

close(i); //0&#xff0c; 1&#xff0c; 2 分别表示标准输入、标准输出和标准错误

      当然&#xff0c;此处关闭哪个文件描述符与实际需要相关&#xff0c;也可以关闭以后再重新打开。

5. 改变当前工作目录

        进程活动时&#xff0c;如果该目录是一个挂载的目录&#xff0c;将导致其文件系统不能卸载。一般需要将工作目录改变到根目录&#xff08;chdir("/")&#xff09;。对于需要转储核心&#xff0c;写运行日志的进程将工作目录改变到特定目录如 /tmp

6. 重设文件创建掩模

        进程从创建它的父进程那里继承了文件创建掩模。由继承得来的文件方式创建屏蔽字可能会拒绝设置某些许可权。例如&#xff0c;若daemon进程要创建一个组可读、写的文件&#xff0c;而继承的文件方式创建屏蔽字&#xff0c;屏蔽了这两种许可权&#xff0c;则要求的组可读、写就不能起作用。为防止这一点&#xff0c;将文件创建掩模清除&#xff1a;

umask(0);

7. 处理SIGCHLD信号

        处理SIGCHLD信号并不是必须的。但对于某些进程&#xff0c;特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结 束&#xff0c;子进程将成为僵尸进程&#xff08;zombie&#xff09;。如果父进程等待子进程结束&#xff0c;将增加父进程的负担&#xff0c;影响服务器进程的并发性能。在Linux下 可以简单地将 SIGCHLD信号的操作设为SIG_IGN。

signal(SIGCHLD,SIG_IGN);

        这样&#xff0c;内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同&#xff0c;BSD4下必须显式等待子进程结束才能释放僵尸进程。


推荐阅读
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
author-avatar
快乐的老爷们土豆_534
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有