暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【Linux】Shell构建DEB包&开启自启

hCodeisDawn 2021-09-16
2799
0
环境简述
    # 系统信息
    hcy@ubuntu:~$ uname -a
    Linux ubuntu 5.4.0-74-generic #83~18.04.1-Ubuntu SMP Tue May 11 16:01:00 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux


    # CPU信息
    hcy@ubuntu:~$ lscpu
    架构:x86_64
    CPU 运行模式:32-bit, 64-bit
    字节序:Little Endian
    ...
    复制


    1
    目录配置
      # 查看示例目录
      hcy@ubuntu:~/Desktop$ tree deb
      deb
      ├── DEBIAN
      │   ├── control
      │   ├── postinst
      │   └── postrm
      └── usr
      ├── bin
      │   └── dwncs
      └── share
      ├── applications
      │   └── dwncs
              └── icons


      # 目录配置
      DEBIAN:
        control:DEB描述性文件
        postinst:软件安装后执行脚本,常用于配置软件执行环境
        postrm:软件卸载后执行脚本,常用于清理收尾工作
        preinst:软件安装前执行脚本,常用于更新前终止进程
        prerm:软件卸载前执行脚本,常用于停止与软件包相关联的daemon服务
        
      usr:软件安装目录
      bin:软件包目录
          dwncs:可执行文件目录
        share:
         applications:desktop文件目录
         icons:图标文件目录
      复制


      2
      脚本文件
        # (1)control
        Package: dwncs
        Version: 1.0.1
        Priority: optional
        Description: 本地组件服务应用
        Architecture: amd64
        Maintainer: hcy
        Homepage:


        # (2)preinst、postinst、prerm、postrm
        #!/bin/sh
        exit 0


        # desktop
        [Desktop Entry]
        Comment=本地组件服务应用
        Exec="/usr/bin/dwncs/dwncs.sh"
        Icon=
        Name=dwncs
        Terminal=false
        Type=Application
        X-Deepin-Vendor=user-custom


        # dwncs.sh(守护进程脚本)
        #! bin/sh
        export LD_LIBRARY_PATH=/usr/bin/dwncs/lib:$LD_LIBRARY_PATH
        cd usr/bin/dwncs
        #进程名字可修改
        PRO_NAME=./dwncs
        UPGRADE=./upgrade
        ${UPGRADE} -d


        while true ; do
        #用ps获取$PRO_NAME进程数量
        NUM=`ps aux | grep -w ${PRO_NAME} | grep -v grep |wc -l`
        #echo $NUM
        #少于1,重启进程
        if [ "${NUM}" -lt "1" ];then
        echo "${PRO_NAME} was killed"
        ${PRO_NAME} -d
        #大于1,杀掉所有进程,重启
        elif [ "${NUM}" -gt "1" ];then
        echo "more than 1 ${PRO_NAME},killall ${PRO_NAME}"
        killall -9 $PRO_NAME
        ${PRO_NAME} -d
        fi
        #kill僵尸进程
        NUM_STAT=`ps aux | grep -w ${PRO_NAME} | grep T | grep -v grep | wc -l`
        if [ "${NUM_STAT}" -gt "0" ];then
        killall -9 ${PRO_NAME}
        ${PRO_NAME} -d
        fi
        sleep 3s
        done
        exit 0
        复制


        3
        Shell基础脚本
          #! bin/sh
          NAME=dwncs
          DESC=本地组件服务应用
          VERSION=0.0.1
          ARCH=amd64
          AUTHOR=hcy
          URL=http://10.1.88.166:8080/dwncs/x86_64/


          DWNCS=dwncs_$VERSION\_$ARCH
          DESKTOP=$DWNCS/usr/local/share/application
          DEBIAN=$DWNCS/DEBIAN
          APP=$DWNCS/usr/bin
          EXE=/usr/bin/dwncs/dwncs.sh
          LIB=/usr/bin/dwncs/lib
          CONF=$APP/dwncs/dwncs.conf


          # 创建desktop
          mkdir -p $DESKTOP
          touch $DESKTOP/dwncs
          chmod 777 $DESKTOP/dwncs


          # desktop
          echo "[Desktop Entry]" > $DESKTOP/dwncs
          echo "Comment=$DESC" >> $DESKTOP/dwncs
          echo "Exec=\"$EXE\"" >> $DESKTOP/dwncs
          echo "Icon=" >> $DESKTOP/dwncs
          echo "Name=dwncs" >> $DESKTOP/dwncs
          echo "Terminal=false" >> $DESKTOP/dwncs
          echo "Type=Application" >> $DESKTOP/dwncs
          echo "X-Deepin-Vendor=user-custom" >> $DESKTOP/dwncs


          # 创建执行文件目录
          mkdir -p $APP
          cp -R dwncs/ $APP
          touch $CONF
          chmod 755 $CONF
          echo "{" > $CONF
          echo -e "\t\"srcUrl\": \"$URL\"" >> $CONF
          echo "}" >> $CONF


          # control
          echo "Package: $NAME" > $DEBIAN/control
          echo "Version: $VERSION" >> $DEBIAN/control
          echo "Priority: optional" >> $DEBIAN/control
          echo "Description: $DESC" >> $DEBIAN/control
          echo "Architecture: $ARCH" >> $DEBIAN/control
          echo "Maintainer: $AUTHOR" >> $DEBIAN/control


          # dpkg
          dpkg -b $DWNCS $DWNCS.deb
          复制


          4
          打包安装
            # (1)执行pkg.sh
            hcy@ubuntu:~/Desktop/pkg$ '/home/hcy/Desktop/pkg/pkg.sh'
            dpkg-deb: 正在 'dwncs_0.0.1_amd64.deb' 中构建软件包 'dwncs'。


            # (2)安装
            hcy@ubuntu:~/Desktop/pkg$ sudo dpkg -i dwncs-0.0.1_amd64.deb
            正在选中未选择的软件包 dwncs
            (正在读取数据库 ... 系统当前共安装有 183557 个文件和目录。)
            正准备解包 dwncs-0.0.1_amd64.deb ...
            正在解包 dwncs (0.0.1) ...
            正在设置 dwncs (0.0.1) ...


            # (3)执行dwncs
            hcy@ubuntu:/usr/bin/dwncs$ sudo ./dwncs.sh
            current absolute path : usr/bin/dwncs/
            dwncs upgrade url: http://10.1.88.166:8080/dwncs/x86_64/
            dwncs download path: usr/bin/dwncs/download/
            filepath: usr/bin/dwncs/download/upgrade.json
            response code: 200
            response codemsg: OK
            local_upgrade_file_md5: b41d78418a5280f28a127edd7fd540e6
            server_upgrade_file_md5: 705d5f78ee56f3e6983170002c5b06c6
            复制


            5
            开机自启
              # (0)注:
              # 调整pkg.sh脚本,在postinst脚本中添加开机自启设置
              # 通过systemctl设置开机自启


              # (1)dwncs.service
              [Unit]
              Description=Example systemd service.


              [Service]
              Type=simple
              ExecStart=/usr/bin/dwncs/dwncs.sh


              [Install]
              WantedBy=multi-user.target


              # (2)pkg.sh调整
              # postinst
              echo "#!/bin/sh" > $DEBIAN/postinst
              echo "sudo cp usr/bin/dwncs/dwncs.service etc/systemd/system/dwncs.service" >> $DEBIAN/postinst
              echo "sudo chmod 644 etc/systemd/system/dwncs.service" >> $DEBIAN/postinst
              echo "sudo systemctl start dwncs" >> $DEBIAN/postinst
              echo "sudo systemctl enable dwncs" >> $DEBIAN/postinst


              # (3)打包安装
              hcy@ubuntu:~/Desktop/pkg$ '/home/hcy/Desktop/pkg/pkg.sh'
              dpkg-deb: 正在 'dwncs-0.0.1_amd64.deb' 中构建软件包 'dwncs'。
              hcy@ubuntu:~/Desktop/pkg$ sudo dpkg -i dwncs_0.0.1_amd64.deb
              正在选中未选择的软件包 dwncs
              (正在读取数据库 ... 系统当前共安装有 183557 个文件和目录。)
              正准备解包 dwncs_0.0.1_amd64.deb ...
              dwncs: 未找到进程
              正在解包 dwncs (0.0.1) ...
              正在设置 dwncs (0.0.1) ...
              Created symlink etc/systemd/system/multi-user.target.wants/dwncs.service → etc/systemd/system/dwncs.service.
              复制


              6
              应用测试

              注:dwncs安装自启开机自启,访问效果如下


              7
              Shell完整脚本
                #! /bin/sh
                NAME=dwncs
                DESC=本地组件服务应用
                VERSION=0.0.1
                ARCH=amd64
                AUTHOR=hcy
                URL=http://10.1.88.166:8080/dwncs/x86_64/


                DWNCS=dwncs_$VERSION\_$ARCH
                DESKTOP=$DWNCS/usr/local/share/application
                DEBIAN=$DWNCS/DEBIAN
                APP=$DWNCS/usr/bin
                EXE=/usr/bin/dwncs/dwncs.sh
                LIB=/usr/bin/dwncs/lib
                CONF=$APP/dwncs/dwncs.conf


                # 创建desktop
                mkdir -p $DESKTOP
                touch $DESKTOP/dwncs
                chmod 777 $DESKTOP/dwncs


                # desktop
                echo "[Desktop Entry]" > $DESKTOP/dwncs
                echo "Comment=$DESC" >> $DESKTOP/dwncs
                echo "Exec=\"$EXE\"" >> $DESKTOP/dwncs
                echo "Icon=" >> $DESKTOP/dwncs
                echo "Name=dwncs" >> $DESKTOP/dwncs
                echo "Terminal=false" >> $DESKTOP/dwncs
                echo "Type=Application" >> $DESKTOP/dwncs
                echo "X-Deepin-Vendor=user-custom" >> $DESKTOP/dwncs


                # 创建执行文件目录
                mkdir -p $APP
                cp -R dwncs/ $APP
                touch $CONF
                chmod 755 $CONF
                echo "{" > $CONF
                echo -e "\t\"srcUrl\": \"$URL\"" >> $CONF
                echo "}" >> $CONF


                # DEBIAN
                mkdir -p $DWNCS/DEBIAN
                touch $DEBIAN/control
                touch $DEBIAN/preinst
                touch $DEBIAN/postinst
                touch $DEBIAN/prerm
                touch $DEBIAN/postrm
                chmod 755 $DEBIAN/control
                chmod 755 $DEBIAN/preinst
                chmod 755 $DEBIAN/postinst
                chmod 755 $DEBIAN/prerm
                chmod 755 $DEBIAN/postrm


                # control
                echo "Package: $NAME" > $DEBIAN/control
                echo "Version: $VERSION" >> $DEBIAN/control
                echo "Priority: optional" >> $DEBIAN/control
                echo "Description: $DESC" >> $DEBIAN/control
                echo "Architecture: $ARCH" >> $DEBIAN/control
                echo "Maintainer: $AUTHOR" >> $DEBIAN/control


                # preinst
                echo "#!/bin/sh" > $DEBIAN/preinst
                echo "sudo killall -9 $NAME" >> $DEBIAN/preinst
                echo "exit 0" >> $DEBIAN/preinst


                # postinst
                echo "#!/bin/sh" > $DEBIAN/postinst
                echo "sudo cp /usr/bin/dwncs/dwncs.service /etc/systemd/system/dwncs.service" >> $DEBIAN/postinst
                echo "sudo chmod 644 /etc/systemd/system/dwncs.service" >> $DEBIAN/postinst
                echo "sudo systemctl start dwncs" >> $DEBIAN/postinst
                echo "sudo systemctl enable dwncs" >> $DEBIAN/postinst
                echo "exit 0" >> $DEBIAN/postinst


                # prerm
                echo "#!/bin/sh" > $DEBIAN/prerm
                echo "sudo systemctl stop dwncs" >> $DEBIAN/prerm
                echo "sudo systemctl disable dwncs" >> $DEBIAN/prerm
                echo "sudo killall -9 $NAME" >> $DEBIAN/prerm
                echo "exit 0" >> $DEBIAN/prerm


                # postrm
                echo "#!/bin/sh" > $DEBIAN/postrm
                echo "sudo rm -rf /usr/bin/dwncs" >> $DEBIAN/postrm
                echo "sudo rm -rf /etc/systemd/system/dwncs.service" >> $DEBIAN/postrm
                echo "exit 0" >> $DEBIAN/postrm


                # dpkg
                dpkg -b $DWNCS $DWNCS.deb
                复制
                文章转载自hCodeisDawn,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论