我想将slapd
LDAP 服务器初始化脚本转换为 Upstart 服务。但是,我对 SysV 初始化脚本(以及 LSB(?) 内容)知之甚少。具体来说,我对respawn
Upstart 的功能很感兴趣。
slapd
Ubuntu 14.04 的初始化脚本是这里。我想到的 Upstart 服务是这里。
我从 sysv 脚本中迁移了足够多的内容吗?我犯了错误吗?我没有从 sysv 脚本中理解的内容,我没有将其包含在 Upstart 作业中。有人可以向我解释一下这个 sysv init 脚本吗?
相关文件发布于GitHub。
背景:
我有几个 LDAP 服务器N 路多主复制。 有一个已知错误这可能会导致内存泄漏,从而导致slapd
守护进程偶尔成为 OOM Killer 的牺牲品。
我的选择包括:
- 开始
slapd
重生(这个问题的主题)。 - 使用较新版本的 OpenLDAP(可能从源代码编译)。
- 向服务器投入更多 RAM。
答案1
你犯了几个错误:
- slapd 和它的选项之间不应该有 --。
- 事件的开始需要有一个
and
中间环节。 - 正如莱蒂齐亚所说,虚拟文件系统应该转变为文件系统。
答案2
LSB 关键字
$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
。