Tips:一般的我使用service模式实现开机自启动,将service文件放入/lib/systemd/system目录,然后执行systemctl enable xxxService,如果服务数量多的时候这简直就是噩梦,下面我来介绍一下bin安装包。
Tips:bin安装包在配置开机启动的时候是非常实用,省略手动配置,并且可以批量操作,不要太好用。
1,准备好一些东西
xxxServices.tar.gz # 请放置你的服务列表,配置列表,脚本等等
# 解压后大概是这个样子
bin # 服务列表,存放可执行文件
service1
service2
config # 配置列表
script # 脚本列表
service1.service
service2.service
# 在准备一个
init.sh
2,整理一下操作
# init.sh
#!/usr/bin/env bash
DEFAULT_DIR=/home/guolihua/Services
SERVICE_DIR=/home/guolihua/Services/script
PASS="xxx" # 如果你不是用的root,但是又需要使用sudo,请在这里写入root密码
root_flag=0
if [ "`whoami`" == "root" ];then
root_flag=1
fi
# [mysql] # 这里你还可以安装一些其他的服务,mysql只是个例子
echo -e "check mysql............................................"
mysql_running=`systemctl status mysql | grep running | grep active | wc -l`
if [ $mysql_running -gt 0 ]; then
echo -e "mysql-server is ok."
else
echo "${PASS}" | sudo apt update
echo "${PASS}" | sudo apt install mysql-server -y
sudo mysql -u root << EOF
# 这里你可以执行一些操作
CREATE USER 'test'@'%' IDENTIFIED BY '123456';
# GRANT ...
EOF
fi
# [services]
if [ ! -z "$INSTALL_DIR" ]; then
DEFAULT_DIR=$INSTALL_DIR
fi
if [[ ! -d "$DEFAULT_DIR" && $root_flag -eq 1 ]]; then
mkdir -p $DEFAULT_DIR
else
echo "${PASS}" | sudo mkdir -p $DEFAULT_DIR
fi
# 这里是对root用户的判断
if [ $root_flag -eq 1 ]; then
# 这句是将当前脚本的exit 0之前的内容,从/tmp/testService.tar.gz压缩包删除
sed -n -e "1,/^exit 0$/!p" "$0" > /tmp/testService.tar.gz 2>/dev/null
tar -zxvf /tmp/testService.tar.gz -C $DEFAULT_DIR
cd /lib && cd systemd/ && cd system/ || exit
services=(
service1
service2
)
for k in ${services[*]}; do
# 确保你的压缩包压缩完之后,里面有service文件
mv ${SERVICE_DIR}/${k}.service /lib/systemd/system/
done
systemctl daemon-reload
for i in ${services[*]}; do
running=`systemctl status $i | grep running | grep active | wc -l`
if [ ${running} -gt 0 ]; then
echo -e "ok: $i is running"
else
echo -e "$i not running"
systemctl enable $i.service # 要注意一点:服务名称必须和service文件名称一样
fi
done
reboot
else
echo "${PASS}" | sudo sed -n -e "1,/^exit 0$/!p" "$0" > /tmp/testService.tar.gz 2>/dev/null
echo "${PASS}" | sudo tar -zxvf /tmp/testService.tar.gz -C $DEFAULT_DIR
cd /lib && cd systemd/ && cd system/ || exit
services=(
service1
service2
)
for k in ${services[*]}; do
echo "${PASS}" | sudo mv ${SERVICE_DIR}/${k}.service /lib/systemd/system/
done
echo "${PASS}" | sudo systemctl daemon-reload
for i in ${services[*]}; do
running=`systemctl status $i | grep running | grep active | wc -l`
if [ ${running} -gt 0 ]; then
echo -e "ok: $i is running"
else
echo -e "$i not running"
echo "${PASS}" | sudo systemctl enable $i.service
fi
done
echo "${PASS}" | sudo reboot
fi
exit 0
#!/usr/bin/env bash
# 制作bin安装包
cat init.sh testServices.tar.gz > init.bin
检查一下init.bin的内容
vim init.bin
看下结果
3,串联一下逻辑
首先,将脚本文件和压缩文件合并,就是cat操作;其次,开始执行bin,按照脚本的逻辑,脚本将删除bin文件exit 0那行以及之前的内容,然后进行解压;最后将解压完成的可执行文件和脚本放入预先设计好的位置。
Tips:.service 文件里面的路径,要和你解压完的可执行文件的路径一致,看下下面的例子
#service1.service
[Unit]
Description=testService
After=network.target network-online.target mysql.service
[Service]
Type=simple
ExecStart=/home/guolihua/Services/bin/service1
KillMode=process
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target