你的管理工具中多了个简单但非常有用的东东。
我喜欢发现新的 UNIX 命令,尤其是那些关于系统管理的。当我得知红帽子发布 chkconfig 这个工具,我想起了在 IRIX --一个从 SGI而来的 UNIX 变种--下的 chkconfig。IRIX 的 chkconfig 用来激活/禁止系统初始化的时候的服务,无需编辑,重命名或是移动 /etc 中的 init 脚本。
类似,Red Hat 设计 chkconfig 的目的就是用来管理系统初始化的时候启动的服务。不过,在我仔细阅读手册并作了些测试后,我很快发现 Red Hat 扩展了chkconfig,通过管理 init 脚本的符号连接得以最终控制启动关闭时的系统任务,真是节省时间!
当你的 linux 启动时, 它显示的第一个进程是 init 。如果你以前没看到过显示 init 进程, 输入:
# ps -ef | grep init
/etc/inittab中说明的任务在init之后就会启动, 不过其它的任务启动很简单。例如,默认情况下 Red Hat 的 /etc/inittab 对 Ctrl-Alt-Delete 键序设置了一个 trap,当这些键在控制台模式下(不是 xdm)同时按下 ,就会运行 shutdown 命令。 在启动的时候,init 基于 /etc/inittab 的设置选项设定这个特性,不过在这个键序发生的时候才会执行。
id:runlevel:action:process
id 代表用户定义的唯一的标志
runlevel 可以使0-6的组合 或者为空
action 来自一个关键词keyword 描述init如何对待process
process 是要执行的命令
描述 action 字段的各种关键字可以在 inittab 的手册中找到。常用的关键字,不是全部,UNIX 平台包括这些:
initdefault 定义一个系统启动后进入的运行级
wait 会被执行一次的进程 (当进入运行级的时候)。init 进程将等待这个进程被终止
boot 定义一个启动的时候执行的进程
bootwait 与 boot 类似 ,不过 init在继续运行前等待进程的终止
sysinit 定义一个进程在 boot的时候执行,在任何 boot或者bootwait inittab 条目的前面执行。
runlevel 字段指明系统状态。例如,运行级 0 代表系统关机,运行级 6 代表系统重启 。不幸的是,不是所有的 Linux 发布都遵循同样的运行级定义 。在 Red Hat 中,默认情况下支持下面这些
0. 系统挂起
1. 但用户Single-user mode
2. 多用户,没有NFS
3. 完整的多用户Complete multiuser mode
4. 用户自定义
5. X11 (XDM 登录)
6. 重新启动
每一个运行级在 /etc/rc.d 下都有个相应的目录。如运行级 5,目录就是 /etc/rc.d/rc5.d 。包含启动这个运行级的时候运行的相关任务的相关文件。在 Red Hat 中, 这些文件一般都是 shell 脚本的符号连接,可以在 /etc/rc.d/init.d 中找到。
让我们用一个简单的例子看一下这些东西, 下面这两个例子行来自我们的 inittab 文件:
id:3:initdefault:
l3:3:wait:/etc/rc.d/rc 3
在 Red Hat 系统中这很典型。一旦 init 被启动 ,读取 /etc/inittab 。 从第一行,我们知道 init 将在系统启动后从运行运行级3。一旦我们到了那个运行级 ,第二行告诉 init 去运行脚本 /etc/rc.d/rc 3 并且在执行前等待终止。
在 /etc/rc.d 目录的 rc 脚本收到 3 作为一个参数。 这个 3 相当于运行级 3。结果 rc 脚本执行 /etc/rc.d/rc3.d 目录中的所有脚本。它首先用参数 "stop" 执行所有 K(代表 "kill"杀掉进程或者服务)打头的脚本,接下来,它运行所有以字母 S 打头的脚本,带有参数 "start" 启动进程或者服务。 最后要指明,K 和 S 脚本的执行顺序是基于排序的;名为 S90mysql 的脚本将在 S95httpd 之前执行。
/etc/rc.d/rc3.d 中的脚本实际是对 /etc/rc.d/init.d 中文件的符号连接。UNIX管理员可以在rc3.d中放制文件, 实际情况下 Red Hat 的 init.d 目录是所有脚本的第一位置,然后生成逻辑连接到 rc*.d 目录。手工进行这些文件的管理很烦人、琐碎。 chkconfig 现在接手这件事情! Red Hat 的这个 chkconfig 工具就是专为管理 /etc/rc.d/rc[0-6].d 中的符号连接而设计。
chkconfig 的二进制软件在 /sbin 下,默认权限允许任何用户执行。不过没有 root 权限的用户只能察看当前的 chkconfig 配置。输入:
[root]# chkconfig --list | grep on
输出的部分内容大致如下:
gpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off
syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
random 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rawdevices 0:off 1:off 2:off 3:on 4:on 5:on 6:off
atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
apmd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sshd 0:off 1:off 2:on 3:off 4:on 5:on 6:off
portmap 0:off 1:off 2:off 3:off 4:on 5:on 6:off
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
xfs 0:off 1:off 2:on 3:off 4:on 5:on 6:off
httpd 0:off 1:off 2:off 3:on 4:off 5:off 6:off
在输出的每一行,最开始的段代表在 /etc/rc.d/init.d 中的 init 脚本名。 其余的区段表示脚本进入各个运行级时的各运行级 0-6 的状态。 例如,crond 应当在进入运行级 2、3、4、5 的时候启动,当进入 0、1、 6的时候停止。我们可以通过 find 命令查找在 /etc/rc.d 中所有 crond 结尾的文件确信我们设置的正确性:
[root]# find /etc/rc.d -name '*crond' -print
/etc/rc.d/init.d/crond
/etc/rc.d/rc0.d/K60crond
/etc/rc.d/rc1.d/K60crond
/etc/rc.d/rc2.d/S40crond
/etc/rc.d/rc3.d/S40crond
/etc/rc.d/rc4.d/S40crond
/etc/rc.d/rc5.d/S40crond
/etc/rc.d/rc6.d/K60crond
[root]# find /etc/rc.d -name '*crond' -exec file {} ;
/etc/rc.d/init.d/crond: Bourne shell script text
/etc/rc.d/rc0.d/K60crond: symbolic link to
../init.d/crond
/etc/rc.d/rc1.d/K60crond: symbolic link to
../init.d/crond
/etc/rc.d/rc2.d/S40crond: symbolic link to
../init.d/crond
/etc/rc.d/rc3.d/S40crond: symbolic link to
../init.d/crond
/etc/rc.d/rc4.d/S40crond: symbolic link to
../init.d/crond
/etc/rc.d/rc5.d/S40crond: symbolic link to
../init.d/crond
/etc/rc.d/rc6.d/K60crond: symbolic link to
../init.d/crond
这表明在 init.d 中找到的 crond 是一个 shell 脚本,找到的所有其他的文件都是对 crond 脚本的符号连接。
调整 chkconfig 的项几乎和列出现在的设置一样容易。格式:
chkconfig [--level <运行级>] <名字>
例如,如果我们决定在运行级 2 禁止crond,
# chkconfig --level 2 crond off
[root]# find /etc/rc.d -name '*crond' -print
/etc/rc.d/init.d/crond
/etc/rc.d/rc0.d/K60crond
/etc/rc.d/rc1.d/K60crond
/etc/rc.d/rc2.d/K60crond
/etc/rc.d/rc3.d/S40crond
/etc/rc.d/rc4.d/S40crond
/etc/rc.d/rc5.d/S40crond
/etc/rc.d/rc6.d/K60crond
切记: chkconfig 不是立即自动禁止或激活一个服务的,它只是简单的改变了符号连接,超级用户可以用这个命令 /etc/rc.d/init.d/crond stop 立刻禁止 crond 服务。最后,你可以用一个命令行激活/禁止多个运行级的某个命令 。 例如输入:
chkconfig --levels 2345 crond on
会设定 crond 在运行级2, 3, 4 和 5启动。