我已经从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
运行良好。
请帮助根除问题,或让我知道在服务器重启时自动重启服务的其他任何方式
答案 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