在 centos 6 衍生产品(Amazon Linux)上,我有一个 init.d 脚本 ecrinit,用于在系统启动时启用/禁用某些服务(基于磁盘上属性文件的内容):
if [[ "$nodeType" == "foo" ]]; then
#turn off mysql, turn on proftpd
service mysqld stop
chkconfig mysqld off # prevent lower-pri mysqld service from
chkconfig proftpd reset # re-enables at run levels 2-4
fi
由于 ecrinit 的启动优先级为 60,而 proftpd 的启动优先级为 88,我预计后者将由启动过程启动,因为上面调用 chkconfig reset 确保了 /etc/rc3.d 中存在适当的文件(已确认)。
但事实似乎并非如此,因为如果我在执行“init 6”之前发出“chkconfig proftpd off”,则 proftpd 上永远不会调用“start”(我在后面的脚本主体中添加了一条日志语句来确认)。换句话说,似乎启动过程在执行 ecrinit 之前检查 /etc/rc3.d 的内容(并且在启动过程中不会检测同一目录中的新文件)...
这是预期的行为吗?如果是这样,我如何控制在给定启动时应启用哪些服务(并避免手动启动它们以保留优先级顺序)?
启动脚本头
[root@lb1 ~]# head /etc/init.d/proftpd
#!/bin/bash
# $Id: proftpd.init,v 1.1 2004/02/26 17:54:30 thias Exp $
#
# proftpd This shell script takes care of starting and stopping
# proftpd.
#
# chkconfig: 234 88 12
# description: ProFTPd is an enhanced FTP server with a focus towards \
# simplicity, security, and ease of configuration. \
# It features a very Apache-like configuration syntax, \
[root@lb1 ~]# head /etc/init.d/ecrinit
#!/bin/bash
#
# chkconfig: 234 19 10
# description: Initializes stuff
chkconfig --list (启动后)
[root@lb1 rc3.d]$ chkconfig --list proftpd
proftpd 0:off 1:off 2:on 3:on 4:on 5:off 6:off
[root@lb1 rc3.d]$ chkconfig --list ecrinit
ecrinit 0:off 1:off 2:on 3:on 4:on 5:off 6:off
uname -a Linux 2.6.35.14-97.44.amzn1.i686 #1 SMP 2011 年 10 月 24 日星期一 16:03:22 UTC i686 i686 i386 GNU/Linux
答案1
看一下/etc/rc
脚本,它执行以下操作:
for i in /etc/rc$runlevel.d/S* ; do
该脚本在运行之前已经扩展了可用的启动脚本列表;通过chkconfig
(或直接文件系统操作)所做的更改将不可见。
如果将逻辑移至启动过程的最后,则可以明确启动服务:
if [[ "$nodeType" == "foo" ]]; then
#turn off mysql, turn on proftpd
service mysqld stop
chkconfig mysqld off # prevent lower-pri mysqld service from
service protftpd start
fi
chkconfig
在这个例子中,使用启用可能没有多大意义proftpd
,因为大概这里的逻辑会在下次系统启动时启动它。
您可能还想调查木偶,它擅长做这种事。