Shell脚本实现软件一键安装和自动重启(一)

前言

在LINUX开发过程中,往往需要对已经开发好的软件进行打包,一键安装后程序能自动后台启动,当进程意外关闭后能自动重启,本篇来介绍实现过程。

业务分析

对功能进行拆分

1、实现程序后台运行,挂掉重启的监听器脚本

2、将监听器脚本放入开机启动项

3、实现软件打包脚本

监听器脚本

首先写个简单的程序,供监听器脚本测试,下述C代码编译生成test

#include 

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程序已经在后台运行。

Shell脚本实现软件一键安装和自动重启(一)_第1张图片

软件打包

下面我将举个例子实现软件打包,如下图,实例中需要打包的软件文件夹为insatll文件夹,test为可执行程序,monitor为监听脚本 ,install.sh为安装命令

Shell脚本实现软件一键安装和自动重启(一)_第2张图片

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程序进程已经启动

Shell脚本实现软件一键安装和自动重启(一)_第3张图片

 

 

 

你可能感兴趣的:(工具)