前言
在LINUX开发过程中,往往需要对已经开发好的软件进行打包,一键安装后程序能自动后台启动,当进程意外关闭后能自动重启,本篇来介绍实现过程。
业务分析
对功能进行拆分
1、实现程序后台运行,挂掉重启的监听器脚本
2、将监听器脚本放入开机启动项
3、实现软件打包脚本
监听器脚本
首先写个简单的程序,供监听器脚本测试,下述C代码编译生成test
#include <stdio.h>
int main()
{
while(1)
{
sleep(3);
}
}
以下是监听器脚本monitor.sh
#bin/bash
#加载环境变量
source /etc/profile
systemctl stop firewalld
systemctl disable firewalld.service
iptables -F
#运行程序路径
EXE_PATH="/mnt/hgfs/ubuntu/install"
#监听器日志路径
LOG_PATH="/mnt/hgfs/ubuntu/install/log.out"
#监听频率
monitor_time=3
#是否开启监听
working_flag=true
cd $EXE_PATH
#根据信号进行开关 kill -10 进程号 开启监听/kill -12 进程号 关闭监听
trap "monitor_start" 10
trap "monitor_stop" 12
monitor_start()
{
working_flag=true
echo -e "['date'] script start\n" >> $LOG_PATH
}
monitor_stop()
{
working_flag=false
echo -e "['date'] script stop\n" >> $LOG_PATH
}
while true
do
if [ $working_flag = "false" ]
then
sleep 1
continue
fi
#在运行程序路径下查找需要运行的软件名称'
CONFIGI=$(ls |grep test)
count=0
for loop in $CONFIGI
do
#查看程序是否在后台运行,不在则启动软件
procnum=$(ps -ef |grep $loop|grep -v grep|wc -l)
if [ $procnum -eq 0 ]
then
if [ -f /etc/redhat-release ]
then
$EXE_PATH$loop >/dev/null &
runexe="$EXE_PATH/$loop >/dev/null &"
echo $runexe >> $LOG_PATH
echo start $loop
else
echo $EXE_PATH/$loop
echo "$EXE_PATH/$loop start\n" >> $LOG_PATH
$EXE_PATH/$loop > /dev/null &
echo statrt $loop
fi
fi
done
sleep $monitor_time
done
监听器脚本测试,以下是运行结果,监听器是循环运行的,CTRL+C退出监听器后,可以看到test程序已经在后台运行。
软件打包
下面我将举个例子实现软件打包,如下图,实例中需要打包的软件文件夹为insatll文件夹,test为可执行程序,monitor为监听脚本 ,install.sh为安装命令
install.sh代码如下:
#!/bin/sh
MONITOR_PATH="./"
RUN_NAME_QRNAPP="test"
RUN_NAME_MONITOR="monitor.sh"
RUN_NAME_MONITOR_ARM="monitor.sh"
SRV_NAME_X64="test_x64.service"
if [ -f /etc/centos-release ];then
echo "0"
if [ -f $MONITOR_PATH$RUN_NAME_MONITOR ]
then
chmod 755 $MONITOR_PATH$RUN_NAME_MONITOR
else
echo "$MONITOR_PATH$RUN_NAME_MONITOR not exist"
exit 1
fi
if [ -f $MONITOR_PATH$SRV_NAME_X64 ];then
chmod 755 $MONITOR_PATH$SRV_NAME_X64
ln -sf bash /bin/sh
else
echo "$MONITOR_PATH$SRV_NAME_X64 not exist"
exit 2
fi
cp -f $MONITOR_PATH$SRV_NAME_X64 /usr/lib/systemd/system
killall -9 $RUN_NAME_MONITOR >/dev/null 2>&1
killall -9 $RUN_NAME_QRNAPP >/dev/null 2>&1
systemctl daemon-reload
systemctl enable $SRV_NAME_X64
systemctl start $SRV_NAME_X64
else
echo "system not support"
exit 3
fi
test_x64.service代码如下:
[Unit]
Description=test service
[Service]
Type=simple
PIDFile=test.pid
ExecStart=/usr/test/monitor.sh &
ExecReload=killall test
ExecStop=killall test
[Install]
WantedBy=multi-user.target
下面是安装路径,install是软件运行环境,loader.sh是安装包运行脚本,pak.sh是打包脚本
pak.sh脚本代码如下:
#bin/bash
tar -zcvf install.tar.gz install/
cat ./loader.sh install.tar.gz > pak
rm -f install.tar.gz
loader.sh脚本代码如下:
#!/bin/sh
ARCHIVE=`awk '/^__ARCHIVE__BELOW__/ {print NR + 1; exit 0; }' "$0"`
tail -n+$ARCHIVE "$0" | tar xzvm -C /usr
if [ $? -ne 0 ]
then
echo "Faile! don't do any edit to this file"
exit
fi
cd /usr/install
chmod 777 /usr/install/*
./install.sh
exit 0
#this line must be the last line of the file
__ARCHIVE__BELOW__
测试
下面我们测试下软件打包的使用
1、首先运行 ./pak.sh
2、观察到生成pak安装包
3、运行pak安装包 ./pak
4、安装完成,观察到/usr目录下已经有install软件文件夹
5、观察进程可以看到监听器进程和test程序进程已经启动