Linux守护进程--依然是进程

简介:

在linux中,服务是一种特殊的进程,可以说它和用户无关,它的作用不是完成用户任务,而是进行一些管理类的操作或者通用的服务类操作,实际上linux的服务就是一个进程,也仅仅是一个进程。

在linux中,服务叫做守护进程,和windows一样,它也执行和具体用户任务无关的支撑性质的任务,可是不同于windows服务复杂的架构,linux守护进程却是一个普通的进程,除此之外它的巧妙在于它是如何成为服务的。在linux中,运行着很多的服务器程序,实际上linux很大意义上就是服务器操作系统。在linux中,终端的意义更大一些,它可以等同于一个shell,负责着一个会话,linux的进程体系架构之一fork/exec机制可以导出shell的重要性,shell就好像一个原点,任何迷路的羔羊都不会走得太远。终端是用户来登录的,它控制着该用户的行为,实际上它可以被看作是该用户的代理。在linux中,和用户终端没有关系的支撑类进程就是守护进程,于是守护进程成了一类相对特殊的进程,只是相对特殊,在业务意义上的特殊,就进程本身而言,它没有什么特殊的。linux的进程体系架构之二进程组/会话期使得守护进程得以如此简单的实现,守护进程无终端,因为它不属于任何具体用户(也可以属于),无须与用户交互(这点很重要),守护进程不能依赖任何用户进程...具体守护进程的定义,google吧。同样通过一个例子来理解枝枝蔓蔓:

#include.h>

#include.h>

#include.h>

#include.h>

#include

#include.h>

#include

int main()

{

int i,fd,len;

len = strlen(buf);

if(fork()!=0)

exit(0);

setsid(); //脱离终端

chdir("/"); //更改根目录

umask(0); //清除掩码

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

close(i);

//为了防止此守护进程重新开启一个终端,可以再fork一次然后退出父进程,这样可以放弃会话组长的身份,因为setsid的调用者将成为会话组长,只有会话组长可以开启终端。

//以下可以开始真正的服务过程

}//编译为ServiceDemo

这就是一个简单的守护进程,但是怎么启动呢?直接运行当然可以,前面说过守护进程是无用户关联的,也就是可以开机自动启动的,那么谁来启动呢?有没有像windows那么酷的启动方式呢?当然有,linux无所不能的,以红帽子为例,其service脚本可以启动/etc/init.d/下面的服务,比如要启动vsftpd,那么就service vsftpd start就搞定了,这样的话,就要写一个脚本,内有start,stop等例程:

#!/bin/bash

. /etc/rc.d/init.d/functions

RETVAL=0

prog="ServiceDemo"

start(){

echo -n $"starting up $prog: "

daemon $prog

echo

return $RETVAL

}

stop(){

echo -n $"Shutting down $prog: "

killproc $prog

echo

return $RETVAL

}

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

stop

start

RETVAL=$?

;;

esac

exit $RETVAL

这个脚本文件命名为demo并且放到/etc/init.d/目录下,那么如果要启动,只需要service demo start就可以了,比windows的右键启动酷吧,linux的内核或者ServiceDemo守护进程本身根本不知道是怎么启动的也没有必要知道,启动策略完全可以自定义实现,最起码根据SystemV和BSD两种启动方式的不同就有两种启动策略,只要合理的进行思考,肯定还有更酷的办法。

linux根本没有用到什么SCM/SCP,RPC机制,仅仅用其强大的进程架构就轻松实现了服务器进程并且没有引入额外的复杂,总结起来linux(当然继承于Unix老大)的进程架构精妙之处有二,前面说过第一是进程的组织,fork/exec机制保证所有进程以init为根组成一个树结构,没有环,很容易管理,遍历也比较方便;第二就是用到了进程组/会话期的概念,在看似统一的进程树上割裂成局部,使得进程树扁平化,这样的话整体上树结构好管理,局部上又是一个个小的整体,就好像分形结构一样。以此为依托,守护进程就是直接挂在init下面的进程了,当然会话期和进程组等概念的相互作用可能不会这么简单,但是大体就是这个样子。在linux中,一切尽量向进程的概念靠拢,在内核中也尽量给执行绪以进程上下文,这样就可以将一切推向美妙的进程架构,如此,根据一个美妙的机制轻而易举的实现了一个策略,这是个自下而上设计胜利的例子,像windows那种以用户为中心的系统是自上而下的设计,它首先考虑的是用户需求。

最后要说的就是在windows中用rpc进行服务控制,而在linux,强大的信号机制使服务控制变得更加直接并且更加简单明了。

//

回复:Linux守护进程--依然是进程 guosha

守护进程就是只要OS启动了,它就可以存在,不依附于任何其字的进程及设备,只依附于OS。所以当在终端启动程序时,最保险的做法需要加上你文中的那个壳就可以了。原因是终端断开时会给所有属于这个会话期的进程发送SIGHUP信号,导致所有跟这个终端关联的进程退出,这里你有三个方法来避免,一是你文中的脱离终端; 二是改变shell的行为,退出时不发送SIGHUP信号给该会话期的其它进程;三是你的程序里修改SIGHUP信号的处理为不退出。因为程序运行外界环境差异性,最好的方法当然是第一种。但后面两种某些情况下也不失为一种选择.

至于service的启动方式,daemon完成的应该也就是提供类似的功能,用daemon去启动的程序应该不一定是要已经做成守护进程了的。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273462

相关文章
|
5月前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
118 13
|
27天前
|
Linux C++
Linux c/c++进程之僵尸进程和守护进程
这篇文章介绍了Linux系统中僵尸进程和守护进程的概念、产生原因、解决方法以及如何创建守护进程。
16 0
|
4月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
4月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
144 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
3月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
|
4月前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
168 1
|
4月前
|
小程序 Linux
【编程小实验】利用Linux fork()与文件I/O:父进程与子进程协同实现高效cp命令(前半文件与后半文件并行复制)
这个小程序是在文件IO的基础上去结合父子进程的一个使用,利用父子进程相互独立的特点实现对数据不同的操作
|
4月前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
186 1
|
5月前
|
Web App开发 运维 监控
深入探索Linux命令pwdx:揭秘进程工作目录的秘密
`pwdx`命令在Linux中用于显示指定进程的工作目录,基于`/proc`文件系统获取实时信息。简单易用,如`pwdx 1234`显示PID为1234的进程目录。结合`ps`和`pgrep`等命令可扩展使用,如查看所有进程或特定进程(如Firefox)的目录。使用时注意权限、进程ID的有效性和与其他命令的配合。查阅`man pwdx`获取更多帮助。
|
5月前
|
存储 Shell Linux
Linux进程概念(下)
本文详细的介绍了环境变量和进程空间的概念及其相关的知识。
36 0
Linux进程概念(下)