現在、エンジニアリンググループ用のさまざまなライセンスサーバーを起動する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に基本的に「あるようですが」そうではないので、標準を維持する方法について本当に懸命に考えています。私のBashスクリプトを呼び出す新しいシステムサービスをしたくありません。
私のコンバージョンを処理する方法についてのアイデアはありますか?
答え1
より小さな部分に分けてみましょう。
- WHO/WHEN/WHERE は systemd のログによって処理されます。たとえば、すべてのユニットのログを照会することができるため、
journalctl -u $APPNAME.service
これらのユニットはここでは必要なく、削除できます。 - 同様に、$ SERVICELOGはsystemdログに置き換えることができます。もはやセルフログの回転管理を心配する必要はありません。
- systemdはカスタム「ステータス」コマンドを直接サポートします。代わりに、
systemctl status
正規化されたステータス出力を使用できます。カスタムステータスコマンドが本当に必要な場合は、それを別のsystemdとして実装できますservice
。 - 残っているのは、同じユーザーが同じ方法で停止して開始したいサービスが複数あることです。システムテンプレートユニットこの問題を解決するために設計されています。テンプレート単位を作成してから、アプリケーションごとにそのテンプレートのインスタンスを作成できます。
systemctl start licensedapps@someapp