鲁棒性

鲁棒性

我想将slapdLDAP 服务器初始化脚本转换为 Upstart 服务。但是,我对 SysV 初始化脚本(以及 LSB(?) 内容)知之甚少。具体来说,我对respawnUpstart 的功能很感兴趣。

slapdUbuntu 14.04 的初始化脚本是这里。我想到的 Upstart 服务是这里

我从 sysv 脚本中迁移了足够多的内容吗?我犯了错误吗?我没有从 sysv 脚本中理解的内容,我没有将其包含在 Upstart 作业中。有人可以向我解释一下这个 sysv init 脚本吗?

相关文件发布于GitHub


背景:

我有几个 LDAP 服务器N 路多主复制。 有一个已知错误这可能会导致内存泄漏,从而导致slapd守护进程偶尔成为 OOM Killer 的牺牲品。

我的选择包括:

  1. 开始slapd重生(这个问题的主题)。
  2. 使用较新版本的 OpenLDAP(可能从源代码编译)。
  3. 向服务器投入更多 RAM。

答案1

我在这里写了一个:https://bitbucket.org/CameronNemo/upstart-jobs/src/b5a709465304bdf420ca2507ed14f6fe67272de8/slapd.conf?at=master

你犯了几个错误:

  • slapd 和它的选项之间不应该有 --。
  • 事件的开始需要有一个and中间环节。
  • 正如莱蒂齐亚所说,虚拟文件​​系统应该转变为文件系统。

答案2

LSB 关键字

根据LSBInitScripts

 $remote_fs all filesystems are mounted. In some LSB run-time environments,
            filesystems such as /usr may be remote. If the script need a mounted 
            /usr/, it needs to depend on $remote_fs. Scripts depending on $remote_fs
            do not need to depend on $local_fs. During shutdown, scripts that need to
            run before sendsigs kills all processes should depend on $remote_fs. 

根据远程文件系统手册页:

 When it occurs, local filesystems such as /usr may not be mounted.  
 For most normal services the  filesystem(7)  event  is sufficient.

您应该使用文件系统事件来更改远程文件系统:

 The  filesystem  event  is generated by the mountall(8) daemon after it
 has mounted all filesystems listed in fstab(5).

鲁棒性

SystemV init 脚本检查$SLAPD_CONF。如果没有任何类型的配置,脚本将无法启动,并且 stop 将以 exit 0 终止而不执行任何操作。

此检查在安装阶段和配置阶段之间重新启动时或在卸载过程中很有用。要理解其含义,您应该分析中的prerm脚本。postrm/var/lib/dpkg/info

例如prerm尝试停止slapd,如果失败则卸载过程也将失败。没有配置文件的停止过程将返回 0 以允许卸载已OpenLDAP安装但未配置的包。

函数check_for_no_start()根据 $SLAPD_NO_START 变量或 $SLAPD_SENTINEL_FILE 文件是否存在来阻止启动执行。这是一种暂时禁用启动的简单方法slapd,例如用于维护。即使服务器重新启动,slapd也不会启动。

功能

SystemV 脚本创建$piddir(如果不存在)并授予正确的权限$SLAPD_PIDFILE,这是必要的,因为slapd将在中写入 pid $SLAPD_PIDFILE

pre_start您应该在脚本中添加它。

根据啟動-停止啟動程式手册页:

    -S, --start [--] arguments
              Check  for  the  existence  of  a  specified process.  If such a
              process exists, start-stop-daemon does nothing, and  exits  with
              error  status 1 (0 if --oknodo is specified).  If such a process
              does  not  exist,  it  starts  an  instance,  using  either  the
              executable  specified  by --exec or, if specified, by --startas.
              Any arguments given after -- on  the  command  line  are  passed
              unmodified to the program being started.

这就是为什么你应该--像 CameronNemo 所说的那样,在 slapd 命令中删除它。

最后停止时有一个选项--retry TERM/10,意思是:

          schedule is a list of at least two items  separated  by  slashes
          (/);  each  item  may be -signal-number or [-]signal-name, which
          means to send that signal, or timeout, which means to wait  that
          many  seconds  for processes to exit, or forever, which means to
          repeat the rest of the schedule forever if necessary.

我猜测 OpendLDAP 需要一些时间来关闭,因此您应该添加节kill timeout 10,它将等待 10 秒(默认为 5 秒)来slapd发送SIGKILL

相关内容