ubuntu服务器程序开机启动

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值