バイナリパッケージ作成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スクリプト

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/