一 service與通常的程序的區別html
service(也稱爲daemon)表示後臺運行的程序,通常隨系統的啓動自動地啓動且在用戶logoff後仍然可以繼續運行。該daemon進程通常在啓動後須要與父進程斷開關係,並使進程沒有控制終端(tty)。由於daemon程序在後臺執行,不須要於終端交互,一般就關閉STDIN、STDOUT和STDER。daemon沒法輸出信息,可使用syslog或本身的日誌系統進行日誌處理。服務器
可使用/etc/rc.d/init.d/functions腳本中的daemon函數來將通常的程序啓動爲daemon,例如nfs daemon的啓動:ide
echo -n $"Starting NFS daemon: "
daemon rpc.nfsd $RPCNFSDARGS $RPCNFSDCOUNT
ETVAL=$?
echo函數
[ $RETVAL -ne 0 ] && exit $RETVAL工具
二 跟 service相關的目錄和文件rest
/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 的連接。htm
/etc/rc.d/rc*.d/ 下的腳本是對 /etc/rc.d/init.d 下的腳本的連接,只是名字增長K或S前綴,用來表示自動啓動或自動中止。blog
全部的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
完!