尝试将 RHEL6 init 脚本转换为 systemd

bj2*_*348 4 bash shell-script systemd sysvinit

我目前在 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)
Run Code Online (Sandbox Code Playgroud)

我已经查看了 systemd 的文档,并且我真的在如何保留我的标准方面苦苦挣扎,因为我所做的很多“似乎”都是 systemd(开始/停止/统计)原生的,我不想只是有一个新的 systemd 服务,它只调用我的 Bash 脚本。

关于如何处理我的转换的任何想法?

Mar*_*erg 5

让我们把它分解成更小的部分:

  • WHO/WHEN/WHERE 由 systemd 的日志处理。你可以查询任何单元的日志,例如journalctl -u $APPNAME.service,所以这些在这里不是必需的,可以删除。
  • 同样,$SERVICELOG 可以替换为 systemd 日志。不再担心管理自己的日志轮换。
  • systemd 直接支持自定义“状态”命令。相反,您可以使用systemctl status标准化的状态输出。如果你真的想要一个自定义状态命令,那将作为一个单独的 systemd 来实现service
  • 剩下的是,您有多个服务要由同一用户以相同的方式停止和启动。systemd模板单元旨在解决该问题。您可以创建单个模板单元,然后为每个应用程序创建该模板的实例:systemctl start licensedapps@someapp