我目前在 RHEL 6.x 机器上有一个 init 脚本,用于为工程组启动各种许可证服务器。
每个供应商都有自己的进程、环境变量和其他启动/停止许可证服务器的细节,因此多年来我为每个应用程序创建了 START、STOP、STAT 脚本,将供应商特定的内容映射到我们站点的标准中。这允许我创建以下通用初始化脚本,我可以通过以下链接软链接到任何应用程序/etc/sysconfig/init.d
:
#!/bin/bash
#
# START/STOP/STAT license servers
#
# chkconfig: 345 95 05
# description: Startup/Shutdown license servers
#####################################
# Who/When/Where
#
WHO=`who am i`
WHEN=`date`
WHERE=`hostname | cut -f1 -d "."`
#####################################
# Figure out how we were called
#
APPNAME=`basename $0 | cut -f2 -d "_"` ; export APPNAME
SERVICELOG="/license/$APPNAME/logs/service.log" ; export SERVICELOG
echo "/etc/init.d/ License Script was ran at: $WHEN app was: $APPNAME command was: $1" >> $SERVICELOG
#################################################
# Time to call App Specific Executable
#
case "$1" in
start) su - licadmin /license/$APPNAME/scripts/START
echo "$APPNAME Daemon Started $WHEN by $WHO on $WHERE" >> $SERVICELOG
;;
stop)
su - licadmin /license/$APPNAME/scripts/STOP
echo "$APPNAME Daemon Stopped $WHEN by $WHO on $WHERE" >> $SERVICELOG
;;
status)
su - licadmin /license/$APPNAME/scripts/STAT
;;
reload|restart)
$0 stop
$0 start
echo "$APPNAME Daemon Restarted $WHEN by $WHO on $WHERE" >> $SERVICELOG
;;
*)
echo "Usage: $0 {start|stop|status|reload|restart}"
exit 1
;;
esac
exit 0
##########################################################################
#EOF(lic_init)
我已经研究了 systemd 的文档,并且我真的很努力地思考如何保留我的标准,因为我所做的很多事情“似乎”是 systemd 原生的(启动/停止/统计),而且我不想只是有一个新的 systemd 服务,它只调用我的 Bash 脚本。
关于如何处理我的转换有什么想法吗?
答案1
让我们把它分解成更小的部分:
- WHO/WHEN/WHERE 由 systemd 的日志处理。您可以在日志中查询任何单位,例如
journalctl -u $APPNAME.service
,因此此处不需要这些单位,可以将其删除。 - 同样,$SERVICELOG 可以替换为 systemd 日志。不再担心管理自己的日志轮换。
- systemd 直接支持自定义“状态”命令。相反,您可以用于
systemctl status
标准化状态输出。如果您确实想要自定义状态命令,则可以将其作为单独的 systemd 实现service
。 - 剩下的就是您有多个服务想要由同一用户以相同的方式停止和启动。系统模板单位旨在解决该问题。您可以创建一个模板单元,然后为每个应用程序创建该模板的实例:
systemctl start licensedapps@someapp