linux - 使服务在系统重启时自动启动时出错

标签 linux unix openldap

<分区>

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

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

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

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

中设置了必要的环境变量

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

最佳答案

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

但是你也有概念上的问题。

/etc/init.d 中的文件是根据一些标准接口(interface)控制守护进程的脚本。 例如以下将启动 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 的符号链接(symbolic link);这两个是具有不同任务的不同程序。

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

关于linux - 使服务在系统重启时自动启动时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18055308/

相关文章:

将 OpenMP 代码编译为 C 代码

linux - 判断所有用户的shell是登录还是非登录shell

linux - 如何使用 cal(1) 打印星期几?

hash - 你如何在 openLDAP 中打开密码散列 (SSHA)

linux - 从信用卡读卡器解码音频

string - 转换输入文件中的字符串

shell - 带有选项 -d 和 IFS 变量组合的 Unix 读取命令

linux - 如何通过命令行安装和设置 LDAP?

docker - docker 容器中的 openldap ch_calloc 核心转储

linux - 更改 PATH 时找不到 Sudo 命令