自定义LSF服务管理
背景
传统的LSF服务管理是通过命令行操作的,而且需要如下多个命令:
- 启动LSF服务
lsadmin limstartup
lsadmin resstartup
badmin hstartup
- 停止LSF服务
badmin hshutdown
lsadmin resshutdown
lsadmin limshutdown
可见管理很不方便。后续又引入了单条命令来管理LSF服务:
- 启动LSF服务
lsf_daemons start
- 停止LSF服务
lsf_daemons stop
相对来讲简化了操作,但并不符合操作系统的服务管理规范。因此又引入了 lsfd.service 服务,可以通过 systemctl 服务管理工具来管理LSF服务。
问题
LSF服务由三个服务进程组成,分别是LIM、RES、SBD;在实践中发现lsfd.service并不能有效地管理这三个服务,如果其中的一个服务掉线后并不能自动拉起。
为了解决这个问题,在最新的LSF 10.1.14 pack中在保留原有lsfd.service的基础上又引入三个服务,分别管理LIM、RES和SBD服务进程,这样LSF的服务项达到了四个之多。感觉增加了管理的复杂度。
解决方案
我们可以通过自定义LSF服务的方法简化管理。方法是在服务进程中定时查看LIM、RES和SBD服务进程,如果发现有进程掉线就及时拉起服务。
以下是示例:
- lsfd.service 示例
[Unit]
Description=IBM Spectrum LSF
After=remote-fs.target network.target nfs.service autofs.service gpfs.service nscd.service
[Service]
Type=simple
Environment="LSF_ENVDIR=/lsf/conf"
Environment="LSF_BINDIR=/lsf/10.1/linux3.10-glibc2.17-x86_64/bin"
Environment="LSF_SERVERDIR=/lsf/10.1/linux3.10-glibc2.17-x86_64/etc"
Environment="LSF_LIBRDIR=/lsf/10.1/linux3.10-glibc2.17-x86_64/lib"
ExecStartPre=/bin/bash -c '(timer=12; while (( $timer )); do if [ ! -d "/lsf/10.1/linux3.10-glibc2.17-x86_64/etc" ]; then sleep 5; else exit 0; fi; timer=$[$timer-1]; done; echo "/lsf/10.1/linux3.10-glibc2.17-x86_64/etc not found." 1>&2; exit 1;)'
ExecStart=/lsf/10.1/linux3.10-glibc2.17-x86_64/etc/lsfwatchdog.sh start
ExecStop=/lsf/10.1/linux3.10-glibc2.17-x86_64/etc/lsfwatchdog.sh stop
KillMode=none
LimitMEMLOCK=infinity
Delegate=yes
[Install]
WantedBy=multi-user.target
- lsfwatchdog.sh 示例
#!/bin/bash
function checkLSFService() {
.