自定义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() {
. $LSF_ENVDIR/profile.lsf
logfile="/lsf/log/watchdog.`hostname`.log"
lim_pid=$( pgrep -u root -f $LSF_SERVERDIR/lim )
[ $lim_pid ] || {
echo "`date` - LSF LIM service is missing." >> $logfile
$LSF_BINDIR/lsadmin limstartup
sleep 1
echo "`date` - LSF LIM service started [`ps -lf -u root |grep $LSF_SERVERDIR/lim|grep -v grep`]" >> $logfile
}
res_pid=$( pgrep -u root -f $LSF_SERVERDIR/res )
[ $res_pid ] || {
echo "`date` - LSF RES service is missing." >> $logfile
$LSF_BINDIR/lsadmin resstartup
sleep 1
echo "`date` - LSF RES service started [`ps -lf -u root |grep $LSF_SERVERDIR/res|grep -v grep`]" >> $logfile
}
sbd_pid=$( pgrep -u root -f $LSF_SERVERDIR/sbatchd )
[ $sbd_pid ] || {
echo "`date` - LSF SBD service is missing." >> $logfile
$LSF_BINDIR/badmin hstartup
sleep 1
echo "`date` - LSF SBD service started [`ps -lf -u root |grep $LSF_SERVERDIR/sbatchd|grep -v grep`]" >> $logfile
} && {
sbd_futex=$(ps -u root -o pid,ppid,stat,wchan,args -e|grep $LSF_SERVERDIR/sbatchd|grep -v grep|awk '{print $4}') && [ $sbd_futex ] && [ "$sbd_futex" == "futex_" ] && {
echo "`date` - LSF SBD service is hung [`ps -lf -u root |grep $LSF_SERVERDIR/sbatchd|grep -v grep`]" >> $logfile
echo "`date` - Kill LSF SBD service." >> $logfile
kill -9 $sbd_pid
echo "`date` - Start LSF SBD service." >> $logfile
$LSF_BINDIR/badmin hstartup
sleep 1
echo "`date` - LSF SBD service started [`ps -lf -u root |grep $LSF_SERVERDIR/sbatchd|grep -v grep`]" >> $logfile
}
}
}
function start() {
while true
do
checkLSFService
sleep 10
done
}
function stop() {
. $LSF_ENVDIR/profile.lsf
logfile="$LSF_ENVDIR/../log/watchdog.`hostname`.log"
echo "`date` - Stop LSF Services." >> $logfile
$LSF_SERVERDIR/lsf_daemons stop
lim_pid=$( pgrep -u root -f $LSF_SERVERDIR/lim ) && [ $lim_pid ] && kill -9 $lim_pid
res_pid=$( pgrep -u root -f $LSF_SERVERDIR/res ) && [ $res_pid ] && kill -9 $res_pid
sbd_pid=$( pgrep -u root -f $LSF_SERVERDIR/sbatchd ) && [ $sbd_pid ] && kill -9 $sbd_pid
mbd_pid=$( pgrep -u root -f $LSF_SERVERDIR/mbatchd ) && [ $mbd_pid ] && kill -9 $mbd_pid
dog_pid=$(pgrep -u root -f $LSF_SERVERDIR/lsfwatchdog.sh|xargs) && [ "x$dog_pid" != "x" ] && kill -9 $dog_pid
}
case $1 in
"start")
start
;;
"stop")
stop
;;
esac
结论
在 LSF 10.1.12 集群中经测试,目前运行良好,掉线的服务可以被及时拉起。
同时,在系统运维操作需要停止服务时也能迅速停止服务。