linux 下(Daemon)守护进程

【linux】 Daemon守护进程 一,守护进程 Linux Daemon(守护进程)守护进程也称精灵进程(daemon)是生存期较长的一种进程。它们常常在系统自 举时启动,仅在系统关闭时才终止。并且它们没有控制终端,是运行在后台的一种特殊进程。 它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通... 阅读详情
      守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进 程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。 比如,作业规划进程crond,打印进程lpd等。

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

一. 守护进程及其特性

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

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

二. 守护进程的编程要点

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

1. 在后台运行。

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

    if(pid=fork())

exit(0); //是父进程,结束父进程,子进程继续

2. 脱离控制终端,登录会话和进程组

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

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

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

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

        现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端(再fork一次):

if(pid=fork()) 

    exit(0); //结束第一子进程,第二子进程继续(第二子进程不再是会话组长)

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

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

for(i=0;i < 3; ++i)

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

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

5. 改变当前工作目录

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

6. 重设文件创建掩模

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

umask(0);

7. 处理SIGCHLD信号

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

signal(SIGCHLD,SIG_IGN);

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

三. 守护进程实例

        fork()两次,将孙子进程“过继”给1号进程init,如果孙子进程成功,其父进程将会是系统1号进程init,如果失败,将由init负责收拾残局。

void InitAsDaemon()

{

if (fork() > 0 ) exit(0);

setsid();

signal(SIGINT, SIG_IGN);

signal(SIGHUP,SIG_IGN);

signal(SIGQUIT, SIG_IGN);

signal(SIGPIPE, SIG_IGN);

signal(SIGTOU, SIG_IGN);

signal(SIGTIN, SIG_IGN);

signal(SIGCHLD, SIG_IGN);

if (fork() > 0) exit(0);

chdir("/");

umusk(0);

}

四. wait和waitpid

        两者相同点都是用于在创建子进程之后,阻塞自己,然后检查自己的子进程中是否有僵尸进程存在,如果存在,该父进程就释放僵尸进程占用的资源,并返回,如果没有这样的僵尸进程,就一直阻塞。

        不同点是后者还有两个pid和option参数。

        pid:当pid > 0时,只等待进程号为pid的进程退出;pid == -1时,等待任意子进程,作用等同于wait;pid == 0时,等待同一进程组中任意子进程;pid < -1 时,等待某个进程组的任意进程,该进程组的组号为pid的绝对值。

        option:有两个值,WNOHANG和WUNTRACED,前者使得waitpid立即返回而不管有没有子进程退出;后者是指其子进程集合中,如果有子进程是STOPED状态,就立即返回,如果该进程是被traced的,那么即使不提供WUNTRACED参数,也立即返回。

       于是可以看出,wait是等待第一个退出的子进程,而waitpid是等待指定子进程退出。因此对于多进程服务器,使用waitpid可以避免因为第一个子进程退出调用了wait,而造成剩余子进程没有wait来处理,引起的僵尸进程的问题。

五. 僵尸进程的处理

        僵尸进程是无法使用kill或者killall来杀死的,虽然僵尸进程并不占用很多系统资源(只是占用进程表process table中的一个项),但是过多的僵尸进程还是会对系统性能造成影响(达到系统进程数上限),因此应尽可能避免:

        1、改写父进程:如上所述,fork两次,将init作为其父进程,由系统负责清理

        2、kill掉僵尸进程的父进程,交由系统处理。

        使用

        ps auwx可以查看系统中僵尸进程,僵尸进程的状态会被标注为“Z”。或者

        ps axf   以树形展示进程表

        ps axm    列出线程,linux下进程线程一致

        ps aux   列出进程的详细信息


参考:

http://blog.youkuaiyun.com/zi_jin/article/details/3861497

http://blog.youkuaiyun.com/ixidof/article/details/6715792

http://hi.baidu.com/qiaoyongfeng/blog/item/3d6fc100bcf93e17738b6576.html


Linux系统编程(守护进程) 本篇文章我们来讲解守护进程,守护进程在进程中是一个比较重要的概念,在笔试面试中也经常考到,这篇文章就带大家来学习一下什么是守护进程。本篇文章就讲解到这里。 阅读详情

相关推荐

STM32CubeMx + FatFs 实战:SD卡DMA传输中断回调问题深度解析

本文深度解析了在STM32CubeMx环境下,结合FatFs文件系统并使用DMA进行SD卡读写时,程序可能出现的“卡死”问题。核心原因在于HAL库的弱函数回调机制未被正确处理,导致DMA传输完成中断后,状态机锁死。文章提供了两种实战修复方案:直接修改HAL库文件或在用户代码中重写回调函数,并给出了关键的配置检查点与调试技巧,帮助开发者彻底解决SD卡DMA传输中断回调失效的难题。

weixin_29176179的博客 330

Linux 认识系统服务(daemon)

文件:/usr/lib/systemd/system /安装软件后,默认的启动脚本都在这个目录下,这里的数据最好不要修改。文件:/run/systemd/system/系统执行过程中产生的服务脚本,这些脚本的优先级比文件目录:/usr/lib/systemd/system要高。文件:/etc/systemd/system/根据需求编写的执行脚本,就比如自己写的一些服务。文件:/etc/sysconfig/*所有服务的初始化的一些选项设置都在这个文件目录下面。文件:/var/lib。

weixin_53064820的博客 4803

TensorFlow实战:5步搞定因果推断模型TARNet(附完整代码)

本文提供了一份基于TensorFlow的TARNet因果推断模型实战指南。通过五个清晰步骤,从数据预处理、模型构建到训练评估,详细讲解了如何利用深度模型解决营销评估、疗效分析等场景中的因果效应估计问题,并附有完整代码解决样本不平衡等工程挑战。

python9snake的博客 415

-daemon 和 nohup ... &

总的来说,一些程序可能支持 `-daemon` 参数,可以通过该参数自行在后台运行,而另一些程序可能需要使用 `nohup` 来确保在后台执行并且不受终端挂起的影响。举例来说,如果你在终端中启动了一个长时间运行的任务,比如一个数据处理任务,而且没有采取措施来处理 SIGHUP 信号,那么当你关闭终端时,该任务可能会收到 SIGHUP 并终止。另外,对于某些系统服务或守护进程,由于它们通常是为了在后台持续运行而设计的,它们可能已经采取了处理 SIGHUP 信号的措施,因此不会受到终端挂起的影响。

m0_54501766的博客 1521

【WSL2 Win10】解决子系统中nividia-smi出现的Failed to initialize NVML GPU access blocked by the operating systeM

环境:WIN10专业版 WSL2 Ubuntu x64架构 尝试在WSL2中装CUDA,装好以后在wsl系统中输入nvidia-smi命令,结果报错。但是在Win10的CMD中正常显示 Failed to initialize NVML: GPU access blocked by the operating system Failed to properly shut down NVML: GPU access blocked by the operating system在网上搜了一下,没太多类似的情况

6745

基于知识图谱的旅游推荐系统

这一系统整合了当今先进的数据技术:采集携程等大型平台的景点数据,通过爬虫技术源源不断地获取最新的旅游信息。此外,我们采用Neo4j图数据库来存储和处理这些数据,结合自然语言处理技术,为你提供精准的旅游建议。:通过直观的知识图谱展示,了解各个景点之间微妙的联系,无论是文化背景还是地理方位,你都能从中发现新的旅行灵感。准备毕业设计的同学,关注我们,这是一个集成了多种前沿技术的项目,为你的学术成果锦上添花。:不再浪费时间,系统根据你的偏好和历史评分,利用协同过滤技术推荐适合的旅游目的地。

qalangtao的博客-qalangtao.com 773

Linux守护进程(daemon)

Linux守护进程实例。

YIVIES 2929

告别“盲开”:手把手教你用MCU内置比较器搞定BLDC无感方波启动(附代码片段)

本文详细介绍了如何利用MCU内置比较器实现BLDC无感方波启动,解决传统无传感器控制中的'盲开'问题。通过虚拟中性点电路设计和三段式启动流程,结合反电动势检测和过零检测技术,提供了一套经济高效的解决方案,并附有可直接移植的代码片段,助力工程师快速实现可靠的无感控制。

weixin_33694172的博客 502

守护进程(Daemon)

守护进程(Daemon)是在计算机操作系统中以后台方式运行的长期运行进程。它通常在系统启动时启动,并在系统运行期间持续运行,负责执行一些特定的任务或提供某种服务。守护进程的概念最早起源于 Unix 系统。在 Unix 系统中,守护进程是由 init 进程(后来演变为 systemd)启动的。

summer_fish的专栏 3610

SpringAI系列 - MCP篇(二) - MCP Server Boot Starter

此处需注意之前的。

罗小爬的技术宝书 1318

【26美赛D题】2026美赛数学建模(MCM/ICM)思路解析及代码分享

2026美赛D题数学建模竞赛思路解析摘要:本文针对美赛D题提供系统性解决方案,提出四层建模框架(数据层、机理层、模型层、决策层),强调逻辑闭环比模型复杂度更重要。包含通用建模步骤:指标体系构建、状态评估、动态预测和策略优化,并给出Python基础代码框架。论文建议采用七段式结构,突出从现实问题到决策方案的完整闭环。核心在于通过数据驱动方法揭示问题规律,结合多源数据整合、系统行为建模和风险评估,最终形成可落地的决策建议,体现数学建模解决实际问题的能力。

一键难忘的博客 1082

linux daemon(守护进程)

什么是Daemon Daemon程序,又称为守护进程,通常在系统后台长时间运行,由于没有控制终端而无法与前台交互。Daemon程序一般作为系统服务使用。Unix/Linux中的daemon进程类似于Windows中的后台服务进程,例如http服务进程nginx,ssh服务进程sshd等。 ps -axj 命令打印系统中各进程的状态。 选择项- a显示由其他用户所拥有的进程的状态。 -x显示没有控制终端的进程的状态。 -j显示与作业有关的信息:对话期 ID、进程组ID、控制终端以及终端进程组 ID。 .

Hakuura天下第一可爱 5719

Oracle EBS(R12+)通过Multi-Org 多组织架构、Multi-Ledger 多账簿、SLA 子分类账会计、多币种引擎、多会计政策并行五大核心能力,为跨国企业提供一体化、自动化、合规的

Oracle EBS(R12+)提供全球会计核算解决方案,通过Multi-Org多组织架构实现跨国集团数据隔离与共享,支持四层组织结构(业务组→法律实体→经营单位→库存组织)。Multi-Ledger多账簿功能允许一笔业务多准则自动核算,包含主账簿、辅助账簿和报告币种。系统内置多币种处理引擎,覆盖全流程货币业务,支持自动重估、再计量和折算。通过SLA子分类账会计实现多会计政策并行处理,满足不同国家会计准则和税制要求。该方案可同时支持本地法定、集团合并及管理分析需求,实现全球财务数据集中管理,提升合规性和运营

金牌架构师 553

linux中Daemon守护进程编程

守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daem...

weixin_30765505的博客 101

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

linux守护进程 daemon,Linux 下创建简单的守护进程(Daemon)

守护进程运行在背景,其父进程 pid=1(init/systemd). 创建守护进程的主要思路,就是 fork 一个子进程,然后父进程挂掉让子进程变为孤儿,最终孤儿被 pid=1 的进程领养。Daemon 的创建步骤 (SysV)1. Forkfork off the parent process & let it terminate if forking was successful. ...

weixin_33229152的博客 520

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux 守护进程 daemon (1)

Daemon程序简介         Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。       比如,我们的网络服务程序,可以在完成创建套接口,绑定套接口,设置套接口为监听模式后

amao992的专栏 2008

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux环境下使用daemon函数实现守护进程

daemon进程是后台守护进程,比如linux 下server都是daemon进程,像httpd、sshd等这些服务你肯定听说过,如果我们想写一个后台运行程序应该怎么做呢?其实非常容易,只要添加unistd.h头文件,然后在调用daemon函数即可...

AlbertS Home of Technology 2962

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

一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库

洪流之源 9900

【Linux】守护进程( Daemon)的定义,作用,创建流程

守护进程( Daemon)守护进程( Daemon)1、定义2、作用3、创建流程4、实例参考 守护进程( Daemon) 1、定义 守护进程是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或循环等待处理某些事件的发生;它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。 守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机才随之一起停止运行; 守护进程一般都以root用户权限运行,因为要使用

JMW1407的博客 3万+

linux下的守护进程(daemon)和系统日志(syslog)

守护进程daemon Unix/Linux中的守护进程(Daemon)类似于Windows中的后台服务进程,一直在后台长时间运行的进程。它通常在系统启动后就运行,没有控制终端,也无法和前台的用户交互,在系统关闭时才结束。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。比如的网络服务程序,可以在完成创建套接口,绑定套接口,设置套接口...

Tian Jincheng's Blog 3336

Linux下守护进程(daemon)的实现

Linux下守护进程(daemon)的实现

凌桓丶的博客 1319

Linux Daemon守护进程编程

守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的

liufan1945的专栏 610

关于python脚本以linux守护进程(daemon)运行

linux守护进程及其特性 守护进程最重要的特性是后台执行。 在这一点上DOS下的常驻内存程序TSR与之类似。其次,守护进程必须与其执行前的环境隔离开来。这些环境包含未关闭的文件描写叙述符。控制终端。会话和进程组,工作文件夹以及文件创建掩模等。 linux守护进程与普通进程的区别 默认情况下,进程是在前台运行的,这时就把shell占据了(有很多日志打印输出),我们无法进行其他操作。所以对于没有交...

chenbogger的博客 3558
上一篇: dbproxy 简介
下一篇: wait和waitpid详解
goodspringin
博客等级 码龄14年 3粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值