二进制包制作rpm (service)

目录

 

前言

spec 文件

编写启动停止脚本(自行修改)

编写service

编译执行


前言

背景:常常需要将 二进制文件打包成 rpm 包, 以便其他人安装使用或上传 yum 源。本文包含两部分内容,二进制包制作 rpm,以service方式运行。
文件说明:
/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 文件

首先,需要将二进制及需要的其他启动脚本放在一个目录下,目录的命名规则以"Name-Version-Release.arch"方式命名,arch为机器的架构,如本人是 X86_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

编写service

为了兼容,使用 /etc/init.d下的方式来编写,也可以使用 systemd编写服务,可自行谷歌。此脚本需编写start,stop,restart等模块。本人参考 hadoop-yarn-manager 撰写。开头使用了service系统调用,详情可参考这篇 博客

. /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.youkuaiyun.com/dlutbrucezhang/article/details/9255081
服务注册 https://blog.51cto.com/sf1314/2112860
Linux进程启动脚本编写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/

<think>我们根据用户的要求,需要生成一个制作Nginx RPM包的核心流程图。结合之前的回答和引用内容,我们可以将流程分解为几个主要步骤,并绘制成流程图。 流程图设计如下(使用Mermaid语法): 1. 环境准备 2. 获取源码与资源 3. 编写Spec文件 4. 构建RPM包 5. 验证安装 同时,我们参考引用内容: 引用[1]提到制作RPM包最重要的是编写spec文件,并建议多参考网上的spec文件。 引用[2]展示了使用Git管理代码和制作RPM包的过程(包括git clone, git add, git commit, git push等)。 引用[3]提供了nginx源码安装的详细配置参数,这些参数可以用于spec文件的%build部分。 因此,流程图将包含这些关键点。 注意:由于用户要求生成流程图,我们将用Mermaid代码表示,并在回答中直接呈现。 流程图如下:</think>以下是制作 Nginx RPM 包的核心流程图,结合引用内容和最佳实践: ```mermaid graph TD A[开始] --> B[环境准备] B --> B1[安装构建工具] B1 --> B2[yum install rpm-build gcc openssl-devel<br>zlib-devel pcre-devel make] B --> B3[创建目录结构] B3 --> B4[mkdir -p ~/rpmbuild/<br>{SOURCES,SPECS,RPMS,SRPMS}] B --> C[获取源码与资源] C --> C1[下载Nginx源码] C1 --> C2[cp nginx-*.tar.gz ~/rpmbuild/SOURCES/] C --> C3[准备系统服务文件] C3 --> C4[创建nginx.service文件] C --> D[编写Spec文件] D --> D1[定义基础信息] D1 --> D2[Name/Version/Release/Summary] D --> D3[配置依赖关系] D3 --> D4[BuildRequires: gcc,pcre-devel,openssl-devel] D3 --> D5[Requires: pcre,openssl,zlib] D --> D6[配置编译参数] D6 --> D7[./configure --prefix=/usr/local/nginx<br>--with-http_ssl_module...] D --> D8[定义安装步骤] D8 --> D9[make install DESTDIR=%{buildroot}] D8 --> D10[安装系统服务文件] D --> D11[定义文件清单] D11 --> D12[/usr/local/nginx/*<br>%{_unitdir}/nginx.service] D --> E[构建RPM包] E --> E1[rpmbuild -ba nginx.spec] E1 --> E2[生成RPM文件<br>~/rpmbuild/RPMS/x86_64/nginx-*.rpm] E --> F[验证安装] F --> F1[rpm -ivh nginx-*.rpm] F1 --> F2[systemctl start nginx] F2 --> F3[检查服务状态] F3 --> G[完成] classDef step fill:#f9f9f9,stroke:#333,stroke-width:1px; classDef important fill:#e6f7ff,stroke:#1890ff,stroke-width:2px; class B1,B3,C1,C3,D3,D6,D8,D11,E1,F1 important; class A,B,B1,B2,B3,B4,C,C1,C2,C3,C4,D,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,E,E1,E2,F,F1,F2,F3,G step; ``` ### 流程说明: 1. **环境准备**(关键步骤)[^1][^2] - 安装编译工具链:`rpm-build`, `gcc`, 开发库 - 创建标准RPM构建目录结构 2. **源码与资源准备**(关键步骤)[^3] - 获取Nginx源码包(需与spec中版本一致) - 准备系统服务文件`nginx.service` 3. **Spec文件编写**(核心步骤)[^1] - **基础定义**:软件名称/版本/描述 - **依赖声明**:编译依赖(BuildRequires)和运行时依赖(Requires) - **编译配置**:包含必要的模块(如SSL, HTTP2等) - **安装步骤**:指定安装路径和系统服务文件 - **文件清单**:明确打包包含的文件路径 4. **构建过程**(关键步骤)[^2] - 执行`rpmbuild -ba`生成二进制RPM和SRPM包 - 输出路径:`~/rpmbuild/RPMS/x86_64/` 5. **验证安装** - 安装RPM包并启动服务 - 检查服务状态和日志确认正常运行 > 关键提示: > - Spec文件需参考成熟项目的写法(如官方SRPM包)[^1] > - 编译参数应根据实际需求定制(如TLS模块/性能优化)[^3] > - 可通过Git管理spec文件和补丁[^2]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值