Linux守护进程--依然是进程-阿里云开发者社区

开发者社区> 科技小能手> 正文

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/1273414

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
linux usb枚举过程分析之守护进程及其唤醒【转】
转自:http://blog.csdn.net/xuelin273/article/details/38646765 usb热插拔,即usb设备可以实现即插即用,像U盘一样,插到电脑里就可以用,不用时可以直接拔除,这个动作不会影响USB设备使用性能。
1154 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8381 0
Linux 命令详解(六)Linux 守护进程的启动方法
Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html
771 0
windows下bat批处理实现守护进程
本文转自网络,由于找不到原作者,因而无法知道出处。如果有幸让原作者看到,请联系我加上。先转载至此。 最近几天加班加疯掉了,天天晚上没法睡。开发部的一个核心程序总是会自己宕机,然后需要手工去起,而这个服务的安全级别又很高,只有我可以操作,搞得我晚上老没法睡,昨晚实在受不了了,想起以前在hp-ux下写的shell守护进程,这回搞个windows下的bat版守护程序吧,当时晚上思路已经很迟钝了,就叫了个兄弟让他写了,上去后运行效果不错,至少昨晚我安心睡了7小时。
477 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10175 0
《Spark与Hadoop大数据分析》——3.1 启动 Spark 守护进程
本节书摘来自华章计算机《Spark与Hadoop大数据分析》一书中的第3章,第3.1节,作者 [美]文卡特·安卡姆(Venkat Ankam),译 吴今朝,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1427 0
23706
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载