0x001 Team

Linux服务启动脚本

一、服务脚本的文件路径

Linux(RH系列) 服务脚本默认都存放在 /etc/rc.d/init.d/目录下, 默认会做一个软链接到 /etc/init.d/

二、服务脚本什么时候执行

Linux 服务脚本在以下启动顺序中执行如下:

  • 起始进程 /etc/init ->
  • 读取 /etc/inittab 配置文件 ->
  • 执行 /etc/rc.d/rc.sysinit 初始化系统脚本 ->
  • 执行 /etc/rc.d/rc 脚本确定运行级别的rcX.d目录 ->
  • 执行 /etc/rc.d/rcX.d/ 目录下S开头的软连接文件(X是inittab配置的数字) ->
  • 执行 /etc/rc.d/init.d/ 下相应的服务脚本

系统初始化完内核、网络、主机名、交换分区、挂载磁盘等一系列动作后,就执行服务脚本

三、最小化安装默认的服务

1. 服务列表

Linux(RH系列) Centos 6.5最小化安装后的服务列表和启动等级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@localhost init.d]# ll
总用量 128
-rwxr-xr-x. 1 root root 3378 6月 22 2012 auditd
-rwxr-xr-x. 1 root root 2793 7月 19 2011 crond
-rw-r--r--. 1 root root 18216 1月 9 2013 functions
-rwxr-xr-x. 1 root root 5829 1月 9 2013 halt
-rwxr-xr-x. 1 root root 9515 2月 22 2013 ip6tables
-rwxr-xr-x. 1 root root 9409 2月 22 2013 iptables
-rwxr-xr-x. 1 root root 652 1月 9 2013 killall
-rwxr-xr-x. 1 root root 2200 9月 14 2012 messagebus
-rwxr-xr-x. 1 root root 2989 1月 9 2013 netconsole
-rwxr-xr-x. 1 root root 5486 1月 9 2013 netfs
-rwxr-xr-x. 1 root root 6334 1月 9 2013 network
-rwxr-xr-x. 1 root root 3852 12月 3 2011 postfix
-rwxr-xr-x. 1 root root 1559 5月 20 2009 rdisc
-rwxr-xr-x. 1 root root 1822 2月 22 2013 restorecond
-rwxr-xr-x. 1 root root 2011 1月 10 2013 rsyslog
-rwxr-xr-x. 1 root root 1698 2月 22 2013 sandbox
-rwxr-xr-x. 1 root root 2056 11月 20 2012 saslauthd
-rwxr-xr-x. 1 root root 647 1月 9 2013 single
-rwxr-xr-x. 1 root root 4534 2月 22 2013 sshd
-rwxr-xr-x. 1 root root 2294 2月 22 2013 udev-post
[root@localhost init.d]# chkconfig --list
auditd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
ip6tables 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
iptables 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
messagebus 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
netconsole 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
netfs 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
network 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
postfix 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
rdisc 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
restorecond 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
rsyslog 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
saslauthd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
sshd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
udev-post 0:关闭 1:启用 2:启用 3:启用 4:启用 5:启用 6:关闭

2. 默认服务说明

1.auditd

Linux审计工具,其负责将审计记录写入磁盘。

2.crond

计划任务服务,用于周期性执行一条或多条指令

4.ip6tables()

ipv6的防火墙

5.iptables

ipv4的防火墙软件

6.messagebus

负责在各个系统进程之间传递消息

7.netconsole

初始化网络控制台登陆

8.netfs

用于在系统启动时自动挂载网络中的共享文件系统,如NFS,Samba等。

9.network

在系统启动时激活所有网络接口

10.postfix

邮件服务器系统,如服务器不提供邮件服务,可关闭

11.rdisc

该服务通过预先加载特定的应用程序到内存中以提供性能。如果你想程序启动更快,就开启它。

12.restorecond

用于给 SELinux 监测和重新加载正确的文件上下文(file contexts)。它不是必须的,但如果你使用 SELinux 的话强烈建议开启它。

13.rsysloge

14.saslauthd

sasl认证服务相关,不用时可关闭

15.sshd(远程登录)

ssh服务端,可提供安全的shell连接,用于远程登录

16.udev-post(设备管理)

设备管理系统,默认情况下”udev”支持很多个规则,用于设备的权限和行为管理,该服务允许用于保存用户应用的

另外还有5个特殊的文件 halt, functions, killall, sandbox ,single 。这些文件的作用时提供init.d目录下的文件使用的统一脚本

四、服务脚本内容说明

我们拿一个服务脚本的片段来重点讲一下服务脚本必备的一下东西

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
[root@centos init.d]# cat sshd
#!/bin/bash
#
# sshd Start up the OpenSSH server daemon
#
# chkconfig: 2345 55 25
# description: SSH is a protocol for secure remote shell access. \
# This service starts up the OpenSSH server daemon.
#
...
### BEGIN INIT INFO
# Provides: sshd
# Required-Start: $local_fs $network $syslog
# Required-Stop: $local_fs $syslog
# Should-Start: $syslog
# Should-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start up the OpenSSH server daemon
# Description: SSH is a protocol for secure remote shell access.
# This service starts up the OpenSSH server daemon.
### END INIT INFO
# source function library
. /etc/rc.d/init.d/functions
...
RETVAL=0
prog="sshd"
lockfile=/var/lock/subsys/$prog
...
PID_FILE=/var/run/sshd.pid
...
start()
{
...
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $lockfile
echo
return $RETVAL
}
stop()
{
echo -n $"Stopping $prog: "
killproc -p $PID_FILE $SSHD
RETVAL=$?
...
[ $RETVAL -eq 0 ] && rm -f $lockfile
echo
}
reload()
{
echo -n $"Reloading $prog: "
killproc -p $PID_FILE $SSHD -HUP
RETVAL=$?
echo
}
restart() {
stop
start
}
...
case "$1" in
start)
rh_status_q && exit 0
start
;;
stop)
if ! rh_status_q; then
rm -f $lockfile
exit 0
fi
stop
;;
restart)
restart
;;
reload)
rh_status_q || exit 7
reload
;;
force-reload)
force_reload
;;
condrestart|try-restart)
rh_status_q || exit 0
if [ -f $lockfile ] ; then
do_restart_sanity_check
if [ $RETVAL -eq 0 ] ; then
stop
# avoid race
sleep 3
start
else
RETVAL=6
fi
fi
;;
status)
rh_status
RETVAL=$?
if [ $RETVAL -eq 3 -a -f $lockfile ] ; then
RETVAL=2
fi
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|force-reload|condrestart|try-restart|status}"
RETVAL=2
esac
exit $RETVAL

1. /var/lock/subsys/ 目录的作用

通常使用这个目录下的文件存在性做为服务启/停的状态标志。

1
2
prog="sshd"
lockfile=/var/lock/subsys/$prog

2. /var/run/ 目录的作用

通常用于存储服务进程的PID,在服务脚本收到关闭、重启指令时向进程PID发送信号

1
PID_FILE=/var/run/sshd.pid

3. 服务脚本函数存在的必要性

sshd 有很多内部函数,但是服务最基本的函数start和stop是应该有的。

4. 服务脚本注释的重要性

服务脚本有几处注释是非常重要的,如果没有这样的注释他就不是一个服务脚本, chkconfig指令没有办法管理

1
2
3
# chkconfig: 2345 55 25
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6

如果没有这3句中的其中一句注释,chkconfig 不认为这个脚本是服务,无法进行add, del等操作,我们来说明一下:

  • # chkconfig: 2345 55 25 分别代表 2345 运行级别默认启动, 启动顺序优先级为55, 关机停止顺序优先级为25
  • 默认情况下服务的所有运行基本都是不启动服务的
  • Default-Stop 的默认停止服务级别是最高的
  • chkconfig: 2345 与 Default-Start: 2 3 4 5 是与的关系,哪个配置来都认为是默认启动的

五、管理服务的命令

1. chkconfig

chkconfig 实际上是管理/etc/rcX.d/目录软链接文件与/etc/rc.d/init.d/目录下文件的对应关系

1
[root@centos]# chkconfig --add sshd

这条chkconfig指令做了以下几件事

  1. 查看/etc/rc.d/init.d/sshd脚本的 chkconfig、Default_start、Default_stop注释字段, 确认是否为服务脚本
  2. 创建rcX.d文件链接,查看一下文件目录可得知
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@centos etc]# find /etc/ -name '*sshd'
    /etc/rc.d/rc0.d/K25sshd
    /etc/rc.d/rc1.d/K25sshd
    /etc/rc.d/rc2.d/S55sshd
    /etc/rc.d/rc3.d/S55sshd
    /etc/rc.d/rc4.d/S55sshd
    /etc/rc.d/rc5.d/S55sshd
    /etc/rc.d/rc6.d/K25sshd
    /etc/rc.d/init.d/sshd

2. service

service 命令接受 服务名称执行动作两个参数,调用 /etc/rc.d/init.d/下的服务脚步执行

1
2
3
[root@centos etc]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]

这条service 指令实际上调用了 /etc/rc.d/init.d/sshd restart