Linux的Service/Daemon你真的懂了吗?

标签: linux service daemon | 发表时间:2011-08-22 16:33 | 作者:iTech liuce.cn
出处:http://www.cnblogs.com/itech/

一 service与一般的程序的区别

service(也称为daemon)表示后台运行的程序,一般随系统的启动自动地启动且在用户logoff后仍然能够继续运行。该daemon进程一般在启动后需要与父进程断开关系,并使进程没有控制终端(tty)。因为daemon程序在后台执行,不需要于终端交互,通常就关闭STDINSTDOUTSTDER。daemon无法输出信息,可以使用syslog或自己的日志系统进行日志处理。

可以使用/etc/rc.d/init.d/functions脚本中的daemon函数来将一般的程序启动为daemon,例如nfs daemon的启动:

echo -n $"Starting NFS daemon: "
daemon rpc.nfsd $RPCNFSDARGS $RPCNFSDCOUNT
ETVAL=$?
echo

[ $RETVAL -ne 0 ] && exit $RETVAL

 

二 跟 service相关的目录和文件

/etc/init.d -> /etc/rc.d/init.d : /etc/rc.d/init.d 下包含了所有的service的控制脚本,/etc/init.d 是 /etc/rc.d/init.d 的链接。

/etc/rc*.d -> /etc/rc.d/rc*.d : /etc/rc.d/rc*.d 下包含了所有的service的自动启动选项的配置,/etc/rc*.d 是 /etc/rc.d/rc*.d 的链接。

/etc/rc.d/rc*.d/ 下的脚本是对 /etc/rc.d/init.d 下的脚本的链接,只是名字增加K或S前缀,用来表示自动启动或自动停止。

所有的service相关的目录树结构如下:

/etc
|-- init.d -> rc.d/init.d
|-- rc -> rc.d/rc
|-- rc.d
| |-- init.d
| | |-- NetworkManager
| | |-- network
| | |-- nfs
| | |-- xinetd
| | |-- ... ...
| |-- rc
| |-- rc.local
| |-- rc.sysinit
| |-- rc3.d
| | |-- K02NetworkManager -> ../init.d/NetworkManager
| | |-- K20nfs -> ../init.d/nfs
| | |-- S10network -> ../init.d/network
| | |-- S56xinetd -> ../init.d/xinetd
| | |-- ... ...
|-- rc.local -> rc.d/rc.local
|-- rc.news
|-- rc.sysinit -> rc.d/rc.sysinit
|-- rc0.d -> rc.d/rc0.d
|-- rc1.d -> rc.d/rc1.d
|-- rc2.d -> rc.d/rc2.d
|-- rc3.d -> rc.d/rc3.d
|-- rc4.d -> rc.d/rc4.d
|-- rc5.d -> rc.d/rc5.d
|-- rc6.d -> rc.d/rc6.d

 

三 一个service的组成和部署

一个service通常包含一个可执行的文件和一个service控制脚本。 作为service程序本身的可执行程序一般存储在/usr/bin下;作为控制service的脚本一般存储在/etc/rc.d/init.d下,且控制service的脚本的格式相对固定,至少支持start,stop,status参数。 例如smb的service控制脚本为:

#!/bin/sh
#
# chkconfig: - 91 35
# description: Starts and stops the Samba smbd and nmbd daemons \
# used to provide SMB network services.
#
# pidfile: /var/run/samba/smbd.pid
# pidfile: /var/run/samba/nmbd.pid
# config: /etc/samba/smb.conf


# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 1
fi

# Avoid using root's TMPDIR
unset TMPDIR

# Source networking configuration.
. /etc/sysconfig/network

if [ -f /etc/sysconfig/samba ]; then
. /etc/sysconfig/samba
fi

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 1

# Check that smb.conf exists.
[ -f /etc/samba/smb.conf ] || exit 6

RETVAL=0


start() {
KIND="SMB"
echo -n $"Starting $KIND services: "
daemon smbd $SMBDOPTIONS
RETVAL=$?
echo
KIND="NMB"
echo -n $"Starting $KIND services: "
daemon nmbd $NMBDOPTIONS
RETVAL2=$?
echo
[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb || \
RETVAL=1
return $RETVAL
}

stop() {
KIND="SMB"
echo -n $"Shutting down $KIND services: "
killproc smbd
RETVAL=$?
echo
KIND="NMB"
echo -n $"Shutting down $KIND services: "
killproc nmbd
RETVAL2=$?
[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && rm -f /var/lock/subsys/smb
echo ""
return $RETVAL
}

restart() {
stop
start
}

reload() {
echo -n $"Reloading smb.conf file: "
killproc smbd -HUP
RETVAL=$?
echo
return $RETVAL
}

rhstatus() {
status smbd
RETVAL=$?
status nmbd
RETVAL2=$?
if [ $RETVAL -ne 0 ] ; then
return $RETVAL
fi
if [ $RETVAL2 -ne 0 ] ; then
return $RETVAL2
fi
}


# Allow status as non-root.
if [ "$1" = status ]; then
rhstatus
exit $?
fi

# Check that we can write to it... so non-root users stop here
[ -w /etc/samba/smb.conf ] || exit 4

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
status)
rhstatus
;;
condrestart)
[ -f /var/lock/subsys/smb ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status|condrestart}"
exit 2
esac

exit $?

 

四 service的管理工具/sbin/service

可以使用工具/sbin/service来查看和管理系统上的所有的service,例如查看所有的service的状态使用/sbin/service --status-all, 或者启动停止或重启某个service为/sbin/service XXX start/stop/restat。

打开/sbin/service脚本,我们可以看到其实service命令实现很简单,就是遍历/etc/init.d (-> /etc/rc.d/init.d)下的所有的service控制脚本,执行相应service控制脚本中的操作。

你可以使用命令cat /sbin/service 来查看/sbin/service的实现。

 

五 service的自动启动控制工具/sbin/chkconfig

当你实现你的service且部署到/etc/init.d下后,你的脚本已经可以手动地启动和关闭,但是要实现在系统启动的时候你的service自动地启动,还需要做简单的配置。我们知道/etc/rc.d/rc*.d下的脚本是对/etc/rc.d/init.d下的service控制脚本的一个连接,用来控制service的自动启动选项的。例如在/etc/rc.d/rc3.d下lrwxrwxrwx 1 root root 16 2009-05-20 S12syslog -> ../init.d/syslog ,此连接文件以S开头表示了在runlevel为3下syslog service将会与系统一起自动地启动。

手动地在/etc/rc.d/rc*.d下创建连接文件来配置service是否自动地启动,实在是有点麻烦,我们可以使用工具/sbin/chkconfig来简化service启动选项的配置。/sbin/chkconfig工具要求service的控制脚本的前几行必须包含如下的类似信息:

#
# chkconfig: - 91 35
# description: Starts and stops the Samba smbd and nmbd daemons \
# used to provide SMB network services.
#

 

 

使用chkconfig的实例如下:

chkconfig --list 用来查看所有的service的启动选项的配置;

chkconfig network 用来查看network service的启动选项的配置;

 

更多查看:6个Linux chkconfig命令实例 - 增加,删除,查看和修改services的自动启动选项

 

六xinetd

xinetd本身是一个service,他的作用是监听所有的端口,根据配置对不同的端口启动不同的应用。 对于有些需要在后台运行的程序,可以选择设置为service在后台一直运行,也可以选择使用xinetd来配置此程序根据需要激活。

 

对于需要频繁访问的服务,需要在/etc/rc.d/init.d下配置为service;

对于不是频繁访问的服务,可以使用xinetd来激活,从而节约服务器的资源;

总之service与xinetd,选一即可。


七 参考: 在Linux下编写Daemon


完!


作者: iTech 发表于 2011-08-22 16:33 原文链接

评论: 0 查看评论 发表评论


最新新闻:
· 纽约时报:没有乔布斯苹果将面临诸多挑战(2011-08-25 12:04)
· Google更新全球网站排行榜(2011-08-25 12:02)
· 苹果新CEO库克已拥有丰富日常运营经验(2011-08-25 12:01)
· 消息称乔布斯身体状况很糟 过去几周足不出户(2011-08-25 11:59)
· 百度人才个人中心上线 求职者可关注心仪职位(2011-08-25 11:58)

编辑推荐:苹果CEO乔布斯宣布辞职 COO蒂姆·库克接任

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [linux service daemon] 推荐:

Linux的Service/Daemon你真的懂了吗?

- liuce.cn - 博客园-iTech's Blog
一 service与一般的程序的区别. service(也称为daemon)表示后台运行的程序,一般随系统的启动自动地启动且在用户logoff后仍然能够继续运行. 该daemon进程一般在启动后需要与父进程断开关系,并使进程没有控制终端(tty). 因为daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDER.

Daemon 起源

- Bane - LinuxTOY
Daemon 在类 Unix 系统世界里代表运行在后台的守护进程,那么这个单词的起源的究竟是什么呢. 要说 Daemon,就不得不提和它十分相近的另外一个单词 Demon. Demon 源自中世纪拉丁语,而 Daemon 则源自古典拉丁语,在相当长的时间,这两者都是互通使用的,表示“具有掌管能力的灵体”.

SPRING BOOT OAUTH2 + KEYCLOAK - service to service call

- - BlogJava-首页技术区
employee-service调用department-service,如果要按OAUTH2.0流程,只需要提供client-id和client-secrect即可. 在KEYCLOAK中引入service-account,即配置该employee-service时,取消standard-flow,同时激活service-account.

Web Service入门

- - 博客 - 伯乐在线
本文来自文章作者 @Jeremy黄国华 的投稿. 伯乐在线也欢迎其他朋友投稿,投稿时记得留下您的新浪微博账号哦~. 目前对Web Service没有统一的定义,定义一:Web Service是自包含的、模块化的应用程序,它可以在Web中被描述、发布、查找以及调用. 定义二:Web Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼任的组件进行操作.

Android Service 详解

- - CSDN博客移动开发推荐文章
一个Service也是一种应用程序组件,它运行在后台以提供某种服务,通常不具有可见的用户界面. 其它的应用程序组件可以启动一个Service,即使在用户切换到另外一个应用程序后,这个Service还是一直会在后台运行. 此外,一个应用程序也可以绑定到一个Service然后使用进程间通信(IPC)方式与Service之间发生交互.

【转】 Service Manager

- - 移动开发 - ITeye博客
android2.3 ---  Service Manager分析. Android系统Binder机制的总管是Service Manager,所有的Server(System Server)都需要向他注册,应用程序需要向其查询相应的服务. 可见其作用是多么的重要,那么我们这里就要重点介绍一下这个.

Web Service的研究

- - CSDN博客系统运维推荐文章
SOA和Web Service. 首先明白SOA和Web Service的关系:. * SOA面向服务架构,用于大型分布式系统的一个概念;. * Web Service是实现SOA的方式之一,不是所有的SOA都是基于Web service的;. * 但Webservice确实为最主流的SOA实现方式,有的人甚至把SOA等同于Webservice.

Android学习之路——7.Service

- - ITeye博客
这两天又学习了Android四大组件之一的Service. (1)Service不是一个单独的Process,除非特别指派了,也不是一个Thread,但也不是运行在Main Thread中. (3)Service的生命周期:. 调用的Context.startService()   oncreate() --> onStartCommand ()--> Service is running --> The service is stopped by its or a client--> onDestroy() --> Service is shut down .

Android Activity与Service通信

- - CSDN博客移动开发推荐文章
一、当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现.      当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用. 比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信.

Restful 和 Jersey介绍(Web Service )

- - CSDN博客架构设计推荐文章
REST 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之一. REST 中最重要的概念是资源(resources) ,使用全球 ID(通常使用 URI)标识. 客户端应用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE )操作资源或资源集.