バイナリパッケージ作成rpm(service)
6162 ワード
目次
前言
specファイル
起動停止スクリプトの作成(自己修正)
サービスの作成
コンパイル実行
背景:バイナリファイルをrpmパッケージにパッケージ化して、他の人がyumソースをインストールしたりアップロードしたりする必要があることがよくあります.本文は2つの部分の内容を含んで、バイナリパッケージはrpmを作って、サービス方式で運行します.ファイルの説明:/usr/bin/gocron-node:バイナリファイル/opt/gocron-node/start.sh:service起動スクリプト/opt/gocron-node/stop.sh:service停止スクリプト/etc/gocron-node/gocron.conf:バイナリ実行プロファイル/etc/init.d/gocron:serviceスクリプト
まず、バイナリおよび必要な他の起動スクリプトを1つのディレクトリの下に配置する必要があります.ディレクトリの命名規則は「Name-Version-Release.arch」で命名され、archは本人がX 86_であるなどのマシンのアーキテクチャです.64.名前とspecには対応しなければなりません.specファイルを書くのは、バイナリパッケージなので、ソースコードがなければbuildプロセスがなく、本人のバイナリはインストールに依存せず、書いていません.ソースパッケージはブログを参照してrpmを作成することができ、主にinstallとfileに関連しています.
スクリプトの作成を推奨し、プロセスがすでに存在し、停止している論理を処理します.
互換性のために/etc/initを使用する.dの下の方式で書くこともできて、systemdでサービスを書くこともできて、自分でグーグルすることができます.このスクリプトはstart,stop,restartなどのモジュールを記述する必要があります.本人はhadoop-yarn-managerを参考に書いています.最初はサービスシステム呼び出しを使用しましたが、詳細はこのブログを参照してください.
specファイルをコンパイルし、サービスを開始
数歩簡単に見えるが、過程は比較的複雑だ.
参考文献
shell正則https://blog.csdn.net/dlutbrucezhang/article/details/9255081サービス登録https://blog.51cto.com/sf1314/2112860Linuxプロセス起動スクリプト作成https://blog.fudenglong.site/2017/03/24/Linux%E8%BF%9B%E7%A8%8B%E5%90%AF%E5%8A%A8%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99/
前言
specファイル
起動停止スクリプトの作成(自己修正)
サービスの作成
コンパイル実行
前言
背景:バイナリファイルをrpmパッケージにパッケージ化して、他の人がyumソースをインストールしたりアップロードしたりする必要があることがよくあります.本文は2つの部分の内容を含んで、バイナリパッケージはrpmを作って、サービス方式で運行します.ファイルの説明:/usr/bin/gocron-node:バイナリファイル/opt/gocron-node/start.sh:service起動スクリプト/opt/gocron-node/stop.sh:service停止スクリプト/etc/gocron-node/gocron.conf:バイナリ実行プロファイル/etc/init.d/gocron:serviceスクリプト
specファイル
まず、バイナリおよび必要な他の起動スクリプトを1つのディレクトリの下に配置する必要があります.ディレクトリの命名規則は「Name-Version-Release.arch」で命名され、archは本人がX 86_であるなどのマシンのアーキテクチャです.64.名前とspecには対応しなければなりません.specファイルを書くのは、バイナリパッケージなので、ソースコードがなければbuildプロセスがなく、本人のバイナリはインストールに依存せず、書いていません.ソースパッケージはブログを参照してrpmを作成することができ、主にinstallとfileに関連しています.
Summary: Go crontab package.
Name: gocronNode
Version: 1.0
Release: 1
License: GPL
Group:Development/Tools
%description
This is go crontab node service.
%prep
%build
%install #
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/etc/gocron-node
mkdir -p $RPM_BUILD_ROOT/opt/gocron-node
mkdir -p $RPM_BUILD_ROOT/etc/init.d
cd $RPM_BUILD_DIR
pwd
tar xzvf ../BUILD/gocronNode-1.0-1.x86_64.tar.gz
cp ../BUILD/gocronNode-1.0-1.x86_64/gocron-node $RPM_BUILD_ROOT/usr/bin
cp ../BUILD/gocronNode-1.0-1.x86_64/start.sh $RPM_BUILD_ROOT/opt/gocron-node
cp ../BUILD/gocronNode-1.0-1.x86_64/gocron.conf $RPM_BUILD_ROOT/etc/gocron-node
cp ../BUILD/gocronNode-1.0-1.x86_64/stop.sh $RPM_BUILD_ROOT/opt/gocron-node
cp ../BUILD/gocronNode-1.0-1.x86_64/gocron $RPM_BUILD_ROOT/etc/init.d
#rpm
%files
/usr/bin/gocron-node
/opt/gocron-node/start.sh
/opt/gocron-node/stop.sh
/etc/gocron-node/gocron.conf
/etc/init.d/gocron
起動停止スクリプトの作成(自己修正)
スクリプトの作成を推奨し、プロセスがすでに存在し、停止している論理を処理します.
#!/bin/bash
# start.sh
conf=$1
PIDFILE=$2
if [[ $PIDFILE == "" ]];then
PIDFILE="/var/run/gocron-node.pid"
fi
oldPid=`pidof gocron-node`
if [[ $oldPid != "" ]];then
echo "[info] gocron-node is active, do nothing..."
exit 0
fi
while read line
do
if [[ `echo $line | grep -v "#"` ]];then
port=$line
break
fi
done < $conf
port=`echo $port | awk -F '=' '{print $2}'`
function isPositiveInt () {
if [[ ${1} =~ ^[0-9]*[1-9][0-9]*$ ]]; then
return 1
fi
return 0
}
isPositiveInt $port
returnValue=$?
if [[ $returnValue -eq 0 ]];then
port=5921
fi
echo "[info] Your custom port: $port"
gocron-node -allow-root true -s 0.0.0.0:$port &
exitCode=$?
pid=`pidof gocron-node`
echo $pid > "$PIDFILE"
exit $exitCode
#!/bin/bash
# stop.sh
info=`netstat -nlp | grep gocron`
gocronPid=`pidof gocron-node`
if [[ $gocronPid == "" ]];then
exit 0
else
echo "[info] Gocron pid:[$gocronPid]."
/bin/kill $gocronPid
exit $?
fi
サービスの作成
互換性のために/etc/initを使用する.dの下の方式で書くこともできて、systemdでサービスを書くこともできて、自分でグーグルすることができます.このスクリプトはstart,stop,restartなどのモジュールを記述する必要があります.本人はhadoop-yarn-managerを参考に書いています.最初はサービスシステム呼び出しを使用しましたが、詳細はこのブログを参照してください.
. /lib/lsb/init-functions
CONF_PATH="/etc/gocron-node/gocron.conf"
EXEC_DIR="/opt/gocron-node"
SLEEP_TIME=3
RETVAL=0
DESC="Go crontab node"
STATUS_RUNNING=0
RETVAL_SUCCESS=0
PROC_NAME='gocron-node'
PIDFILE="/var/run/gocron-node.pid"
STATUS_RUNNING=0
STATUS_DEAD=1
STATUS_DEAD_AND_LOCK=2
STATUS_NOT_RUNNING=3
start() {
echo "[info] Default port: 5921, custom by changing $CONF_PATH"
/bin/bash $EXEC_DIR/start.sh $CONF_PATH $PIDFILE
# Some processes are slow to start
sleep $SLEEP_TIME
checkstatusofproc
RETVAL=$?
if [ $RETVAL -eq $STATUS_RUNNING ]; then
log_success_msg "[info] Started ${DESC}: "
else
log_failure_msg "[err ] Failed to start ${DESC}. Return value: $RETVAL"
fi
return $RETVAL
}
stop() {
/bin/bash $EXEC_DIR/stop.sh
RETVAL=$?
if [ $RETVAL -eq $RETVAL_SUCCESS ]; then
log_success_msg "[info] Stopped ${DESC}: "
else
log_failure_msg "[err ] Failed to stop ${DESC}. Return value: $RETVAL."
fi
}
restart() {
stop
start
}
checkstatusofproc(){
pidofproc -p $PIDFILE $PROC_NAME > /dev/null
}
checkstatus(){
checkstatusofproc
status=$?
case "$status" in
$STATUS_RUNNING)
log_success_msg "[info] ${DESC} is running"
;;
$STATUS_DEAD)
log_failure_msg "[info] ${DESC} is dead and pid file exists"
;;
$STATUS_DEAD_AND_LOCK)
log_failure_msg "[info] ${DESC} is dead and lock file exists"
;;
$STATUS_NOT_RUNNING)
log_failure_msg "[info] ${DESC} is not running"
;;
*)
log_failure_msg "[info] ${DESC} status is unknown"
;;
esac
return $status
}
check_for_root() {
if [ $(id -ur) -ne 0 ]; then
echo '[err ] Error: root user required'
echo
exit 1
fi
}
service() {
case "$1" in
start)
check_for_root
start
;;
stop)
check_for_root
stop
;;
status)
checkstatus
RETVAL=$?
;;
restart)
check_for_root
restart
;;
*)
echo $"[info] Usage: $0 {start|stop|status|restart}"
exit 1
esac
}
service "$@"
exit $RETVAL
コンパイル実行
specファイルをコンパイルし、サービスを開始
rpmbuild -bb gnode.spec #
rpm -ivh xxxx.rpm #
# rpm -e xxx #
service gocron start #
数歩簡単に見えるが、過程は比較的複雑だ.
参考文献
shell正則https://blog.csdn.net/dlutbrucezhang/article/details/9255081サービス登録https://blog.51cto.com/sf1314/2112860Linuxプロセス起動スクリプト作成https://blog.fudenglong.site/2017/03/24/Linux%E8%BF%9B%E7%A8%8B%E5%90%AF%E5%8A%A8%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99/