在系统重新启动时启用服务启动时出错

时间:2013-08-05 09:56:30

标签: linux unix openldap

我已经从Redhat Linux服务器上的外部tar文件安装了OpenLdap(而不是默认的rpm包)。之后,我成功启动了服务/usr/local/sbin/slapd。此服务需要设置环境变量:

export LD_LIBRARY_PATH="/root/db-6.0.20/build_unix/.libs"

以便服务可以使用所有必需的库文件。但是,我希望该服务能够在系统重启时自动重启。我在/usr/local/sbin/slapd下创建了服务/etc/init.d的软链接:

lrwxrwxrwx 1 root root 21 Aug  5 14:34 slapd -> /usr/local/sbin/slapd

当我尝试检查时service slapd restart显示以下错误:

[root@dgseir init.d]# service slapd restart
/etc/init.d/slapd: error while loading shared libraries: libdb-6.0.so: cannot open shared object file: No such file or directory

因此,我无法使用chkconfig为此设置运行级别。但是,由于我在/usr/local/sbin/slapd

中设置了必要的环境变量,因此服务从其绝对路径.bash_profile运行良好。

请帮助根除问题,或让我知道在服务器重启时自动重启服务的其他任何方式

2 个答案:

答案 0 :(得分:1)

首先,我建议您使用LD_LIBRARY_PATH或LD_PRELOAD技巧进行系统服务。 相反,您应正确安装所有必需的库。 这样做会自动解决您的问题而无法找到libdb-6.0.so(因为.so文件将被安装到/usr/local/lib/

但你也有一个概念性的问题。

/etc/init.d中的文件是脚本,它们根据某些标准接口控制守护进程。 例如以下将启动 foo 守护程序

/etc/init.d/foo start

然而这会阻止它:

/etc/init.d/foo stop

在大多数情况下,实际的守护进程二进制文件将具有完全不同的语法。例如 slapd 守护程序实际上将按以下方式运行:

/usr/local/sbin/slapd -h ldap:/// ldaps:/// \
                      -g openldap -u openldap \
                      -F /etc/ldap/slapd.d

/etc/init.d/slapd 脚本将负责使用正确的参数调用二进制/usr/local/sbin/slapd(并在使用stop参数调用时终止它)。

这基本上意味着,您不能简单地创建从/etc/init.d/slapd/usr/local/sbin/slapd的符号链接;这两个是不同的程序,具有不同的任务。

你的系统上应该有一个示例init.d脚本/etc/init.d/skeleton(至少在Debian上是这种情况;我不知道Redhat)。看看这个例子。根据您的需要采用它(您会发现可以在脚本中设置LD_LIBRARY_PATH变量)

答案 1 :(得分:-1)

在开始第一次导出共享库之前。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path-to-required-library

例如,如果你的库位于/ home / use / lsap / lib

e.g export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/use/lsap/lib