1

我已经从 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

请帮助消除问题,或者让我知道任何其他方式以使服务在服务器重新启动时自动重新启动

4

2 回答 2

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/slapdto创建符号链接/usr/local/sbin/slapd;这两个是具有不同任务的不同程序。

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

于 2013-08-05T10:13:11.517 回答
-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

于 2013-08-05T10:24:16.560 回答