Shell指令碼實現軟體一鍵安裝和自動重啟 一

2021-08-30 13:59:28 字數 4102 閱讀 5163

在linux開發過程中,往往需要對已經開發好的軟體進行打包,一鍵安裝後程式能自動後台啟動,當程序意外關閉後能自動重啟,本篇來介紹實現過程。

對功能進行拆分

1、實現程式後台執行,掛掉重啟的***指令碼

2、將***指令碼放入開機啟動項

3、實現軟體打包指令碼

首先寫個簡單的程式,供***指令碼測試,下述c**編譯生成test

#include int main()

}

以下是***指令碼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()

monitor_stop()

while true

doif [ $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

fifi

done

sleep $monitor_time

done

***指令碼測試,以下是執行結果,***是迴圈執行的,ctrl+c退出***後,可以看到test程式已經在後台執行。

下面我將舉個例子實現軟體打包,如下圖,例項中需要打包的軟體資料夾為insatll資料夾,test為可執行程式,monitor為監聽指令碼 ,install.sh為安裝命令

install.sh**如下:

#!/bin/sh

monitor_path="./"

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

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=******

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__/ ' "$0"`

tail -n+$archive "$0" | tar xzvm -c /usr

if [ $? -ne 0 ]

then

echo "faile! don't do any edit to this file"

exit

ficd /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指令碼一鍵安裝zabbix

bin bash zabbix 一鍵部署指令碼 echo 正在配置firewall防火牆 systemctl stop firewalld dev null systemctl disable firewalld dev null if eq 0 then echo firewall防火牆初始化完畢...

shell指令碼一鍵安裝lnmp

bin bash 安裝nginx依賴 yum y install gcc gcc c pcre devel zlib devel openssl devel 解壓nginx安裝包 tar zxf nginx 1.12.2.tar.gz cd nginx 1.12.2 編譯安裝 configure m...

一鍵安裝Harbor倉庫(shell指令碼)

請安裝前修改正確的hostname 或者自己更換的埠 bin bash 網域名稱設定 hostname 192.168.56.24 埠port 80 禁止使用者註冊 self registration off 設定只有管理員可以建立專案 project creation restriction ad...