这可能有一个简单的解释,但我肯定想不到。
我已经安装了 corosync(通过 yum),它是默认的初始化脚本。这个特定的 CentOS 安装有些奇怪,因为我经常需要手动将 /etc/rc.d/init.d/ 链接到 /etc/init.d。
问题是它在通过它的符号链接运行时失败,但它通过 /etc/rc.d/init.d 运行良好
更奇怪的是,如果使用完整路径运行,它就无法运行,而且只有在 /etc/rc.d/init.d 目录中实际运行时才会运行。
例子:
[~]# /etc/rc.d/init.d/corosync start
Starting Corosync Cluster Engine (corosync): [FAILED]
[~]# service corosync status
corosync is stopped
[~]# cd /etc/rc.d/init.d/
[init.d]# /etc/rc.d/init.d/corosync start
Starting Corosync Cluster Engine (corosync): [FAILED]
[init.d]# corosync start
[init.d]# service corosync status
corosync (pid 1985) is running...
有什么解释吗?
编辑:
不确定我到底做了什么更改,但它现在在从 /rc.d/init.d 启动时有效,但在服务 corosync 启动时无效。
[root@server2 mirror]# /etc/rc.d/init.d/corosync start
Starting Corosync Cluster Engine (corosync): [ OK ]
[root@server2 mirror]# /etc/init.d/corosync start
Starting Corosync Cluster Engine (corosync): [FAILED]
[root@server2 mirror]# service corosync start
Starting Corosync Cluster Engine (corosync): [FAILED]
编辑 2:
建立了一个从 /etc/rc.d/init.d 到 /etc/init.d 的符号链接 .. 现在它可以在通过 service corosync start 运行时工作.. 但不会在启动时启动,哎呀。
编辑 3:
它适用于除启动外的所有命令。
我已将运行级别更改为 99,但它仍然失败,并且我已将脚本内的路径更改为绝对路径:/usr/sbin/corosync
我还做了环境变量的差异:
在服务 corosync 启动时:
_=/bin/env
LANG=en_US.UTF-8
PATH=/sbin:/usr/sbin:/bin:/usr/bin
PWD=/
SHLVL=1
TERM=xterm
启动时:
_=/bin/env
LANG=en_US.UTF-8
PATH=/sbin:/usr/sbin:/bin:/usr/bin
PWD=/
SHLVL=2
TERM=linux
CONSOLETYPE=vt
LANGSH_SOURCED=1
previous=N
PREVLEVEL=N
runlevel=3
RUNLEVEL=3
UPSTART_EVENTS=runlevel
UPSTART_INSTANCE=
UPSTART_JOB=rc
开机日志:
Starting Corosync Cluster Engine (corosync): [FAILED]
所以现在脚本在系统已经启动时工作,但在启动期间不工作。
也许有第三个版本的 corosync 脚本?/etc/rc2.d/ 中的版本链接到 /etc/init.d/ 中的版本还是不同?
顺便说一下,我们已经走到这一步了,甚至没有考虑您的集群设置。如果这是集群的一部分,其他节点的日志文件中可能会有线索。
尝试调试初始化脚本
-x
也尝试使用
service start|stop|status corosync
.如果
corosync start
在任何目录中工作但/etc/rc.d/init.d/corosync start
失败,那么您可能正在运行两个不同的脚本。跑:which corosync
如果不是,请在 corosync 脚本内部检查应该是绝对路径的相对路径。
所以现在的问题是它
/etc/init.d/corosync start
可以与 bash -x 一起使用,但不能没有,也不能在启动时使用。那正确吗?没有
bash /etc/init.d/corosync start
(没有-x
工作)?可能在您的配置文件中设置了一个环境变量,当系统在引导过程中运行脚本时该变量不存在。添加一行
env |sort > /tmp/env.$$
,/etc/init.d/corosync
然后diff
是生成的文件。另一种可能性是对另一个服务的隐藏依赖,该服务稍后在引导过程中启动。尝试更改为
S99...
我遇到过同样的问题...
查看:
#getenforce
如果它返回“Enforcing”,那么您必须在文件中禁用 SELinux:/etc/selinux/config
动态地:
# 设置强制 0