[转帖]晨曦之光 Linux守护进程--依然是进程_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3743 | 回复: 0   主题: [转帖]晨曦之光 Linux守护进程--依然是进程        下一篇 
lengyuLee
注册用户
等级:少校
经验:1118
发帖:83
精华:5
注册:2013-3-7
状态:离线
发送短消息息给lengyuLee 加好友    发送短消息息给lengyuLee 发消息
发表于: IP:您无权察看 2013-3-14 16:50:46 | [全部帖] [楼主帖] 楼主

文章转载自:http://blog.csdn.net/dog250/article/details/5303608

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

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

同样通过一个例子来理解枝枝蔓蔓:

#include
#include
#include
#include
#include
#include
#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去启动的程序应该不一定是要已经做成守护进程了的。

该贴被lusxingbao编辑于2013-3-19 9:35:00
该贴被lusxingbao编辑于2013-3-19 9:36:31

该贴被lusxingbao编辑于2013-3-19 9:38:20



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论