RPM开机自启+退出保活,再不担心java进程掉了~

  • Post author:
  • Post category:java




RPM简介

RPM的全名是Red Hat Package Manager,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理。

简单说,RPM就是将部署统一化,一键化。



RPM优点和缺点

  1. 优点

    由于已经编译完成并且打包,所以安装很方便

    由于套件信息已经记录在Linux主机的数据库中,方便查询、升级与卸载
  2. 缺点

    安装环境必须与打包时的环境一致

    需要满足软件的依赖属性需求

    卸载时需要特别小心,最底层的软件不可以先删除,否则可能造成整个系统出问题



Java 打RPM包

在这里插入图片描述



maven 加rpm-maven-plugin插件

        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>rpm-maven-plugin</artifactId>
                    <version>2.2.0</version>
                    <executions>
                        <execution>
                            <id>generate-rpm</id>
                            <phase>package</phase>
                            <goals>
                                <goal>rpm</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <defineStatements>
                            <defineStatement>_target_os linux</defineStatement>
                        </defineStatements>
                        <vendor>ZheJiang Yuce Technologies Ltd.</vendor>
                        <license>GPL</license>
                        <defaultDirmode>0755</defaultDirmode>
                        <defaultFilemode>0644</defaultFilemode>
                        <defaultUsername>work</defaultUsername>
                        <defaultGroupname>work</defaultGroupname>
                        <summary>让世界用好数据</summary>
                        <prefix>${rpm.install.home}/${project.name}</prefix>
                        <version>${project.version}</version>
                        <!--suppress UnresolvedMavenProperty -->
                        <release>${git.commit.id.abbrev}</release>

                        <mappings>
                            <mapping>
                                <directory>${rpm.install.home}/${project.name}</directory>
                                <username>work</username>
                                <groupname>work</groupname>
                                <sources>
                                    <source>
                                        <location>${basedir}</location>
                                        <includes>
                                            <include>NOTICE</include>
                                            <include>LICENSE</include>
                                            <include>*.md</include>
                                        </includes>
                                    </source>
                                    <source>
                                        <location>target/${project.build.finalName}.jar</location>
                                    </source>
                                </sources>
                            </mapping>

                            <mapping>
                                <directory>${rpm.install.home}/config/${project.name}</directory>
                                <username>work</username>
                                <groupname>work</groupname>
                                <configuration>true</configuration>
                            </mapping>

                            <mapping>
                                <directory>${rpm.install.home}/${project.name}/logs</directory>
                                <configuration>true</configuration>
                            </mapping>

                            <mapping>
                                <directory>${rpm.install.home}/${project.name}/lib</directory>
                                <sources>
                                    <source>
                                        <location>target/lib</location>
                                        <includes>
                                            <include>**/*.jar</include>
                                        </includes>
                                    </source>
                                </sources>
                            </mapping>
                            <mapping>
                                <directory>${rpm.install.home}/${project.name}/bin</directory>
                                <filemode>0500</filemode>
                                <sources>
                                    <source>
                                        <location>${project.basedir}/../distribute/bin</location>
                                        <includes>
                                            <include>**/*.sh</include>
                                        </includes>
                                        <filter>true</filter>
                                    </source>
                                </sources>
                            </mapping>
                            <mapping>
                                <directory>/usr/lib/systemd/system</directory>
                                <directoryIncluded>false</directoryIncluded>
                                <filemode>0644</filemode>
                                <username>root</username>
                                <groupname>root</groupname>
                                <sources>
                                    <source>
                                        <location>${project.basedir}/../distribute/setup.service</location>
                                        <filter>true</filter>
                                        <destination>yuce-${project.name}.service</destination>
                                    </source>
                                </sources>
                            </mapping>

                            <mapping>
                                <directory>/etc/nginx/conf.d</directory>
                                <directoryIncluded>false</directoryIncluded>
                                <username>nginx</username>
                                <groupname>nginx</groupname>
                                <configuration>noreplace</configuration>
                                <sources>
                                    <source>
                                        <location>src/main/resources/nginx</location>
                                        <failIfLocationNotExists>false</failIfLocationNotExists>
                                        <includes>
                                            <include>*.conf</include>
                                        </includes>
                                        <filter>true</filter>
                                    </source>
                                </sources>
                            </mapping>
                        </mappings>
                        <preinstallScriptlet>
                            <scriptFile>${project.basedir}/../distribute/rpm/preinst</scriptFile>
                            <fileEncoding>UTF-8</fileEncoding>
                            <filter>true</filter>
                        </preinstallScriptlet>
                        <postinstallScriptlet>
                            <scriptFile>${project.basedir}/../distribute/rpm/postinst</scriptFile>
                            <fileEncoding>UTF-8</fileEncoding>
                            <filter>true</filter>
                        </postinstallScriptlet>
                    </configuration>
                </plugin>
            </plugins>


        </pluginManagement>
    </build>



preinst 文件

# !/bin/bash

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

/usr/bin/getent group work > /dev/null || /usr/sbin/groupadd --system work
/usr/bin/getent passwd work > /dev/null || /usr/sbin/useradd --system \
    --gid work \
    --home-dir /home/work \
    --shell /sbin/nologin \
    work > /dev/null



postinst 文件

# !/bin/bash

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

declare -r APP_CONFIG_DIR="${rpm.install.home}/config/${project.name}"
declare -r APP_SHELL_DIR="${rpm.install.home}/shell/${project.name}"

if [ ! -d "${APP_CONFIG_DIR}" ] ; then
  /usr/bin/mkdir -p "${APP_CONFIG_DIR}"
fi

if [ ! -f "${APP_CONFIG_DIR}/env.conf" ]; then
  echo "JAVA_OPTS=-Xmx2048m" > "${APP_CONFIG_DIR}/env.conf"
fi

function translate_from_file() {
  filename="${rpm.install.home}/config/cloud-eyes/${1}"
  if [ ! -f "${filename}" ] ; then

    # 基于推动升级的考虑,我们不做软链接反向兼容
    /usr/bin/cp "${2}" "${filename}"
    # /usr/bin/rmdir --ignore-fail-on-non-empty -- "$(/usr/bin/dirname -- ${filename})"
  fi
}

if [ ! -f "${APP_CONFIG_DIR}/application.yaml" ] ; then

  case "${project.name}" in
  cloud-eyes)
    translate_from_file "default-customize.yaml" "/home/work/frontend/cloud-eyes-0.0.1-SNAPSHOT/config/default-customize.yaml"
    translate_from_file "application.yaml" "/home/work/frontend/cloud-eyes-0.0.1-SNAPSHOT/config/application.yaml"
    translate_from_file "cloud-eyes-config.yaml" "/home/work/frontend/cloud-eyes-0.0.1-SNAPSHOT/config/cloud-eyes-config.yaml"
    translate_from_file "table-config.yaml" "/home/work/frontend/cloud-eyes-0.0.1-SNAPSHOT/config/table-config.yaml"
    translate_from_file "table-gen.yaml" "/home/work/frontend/cloud-eyes-0.0.1-SNAPSHOT/config/table-gen.yaml"
    ;;

  esac
fi

/usr/bin/chown -R work:work "${APP_CONFIG_DIR}"
/usr/bin/chmod -R 0755 "${APP_CONFIG_DIR}"

/bin/systemctl preset yuce-${project.name}
/bin/systemctl daemon-reload
/bin/systemctl --force enable yuce-${project.name}
/bin/systemctl restart yuce-${project.name}




.service 文件

[Unit]
Description=Yuce Application Service
After=network.target

[Service]
Type=forking
User=work
Group=work
EnvironmentFile=${rpm.install.home}/config/${project.name}/env.conf
WorkingDirectory=${rpm.install.home}/${project.name}
ExecStart=/bin/bash ${rpm.install.home}/${project.name}/bin/restart.sh
#PIDFile=${rpm.install.home}/${project.name}/logs/run.pid
KillMode=control-group
Restart=on-failure
RestartSec=10
StartLimitInterval=600
StartLimitBurst=50
TimeoutStopSec=3s

[Install]
WantedBy=multi-user.target



RPM 常用命令

rpm 基本命令

安装: rpm -ivh cloud-eyes-0.0.1-96e3ea5.noarch.rpm

在这里插入图片描述

升级: rpm -Uvh cloud-eyes-0.0.1-96e3ea5.noarch.rpm

在这里插入图片描述

查询已安装的rpm: rpm -qa cloud-eyes

在这里插入图片描述

查询某rpm详细信息:rpm -qpi cloud-eyes-0.0.1-094a474.noarch.rpm

在这里插入图片描述

卸载: sudo rpm -e cloud-eyes –allmatches –nodeps (强制卸载)

在这里插入图片描述

参考文档:

https://blog.csdn.net/Mr_Yang__/article/details/84133783

https://www.cnblogs.com/jhxxb/p/10654554.html

http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

https://www.cnblogs.com/harrymore/p/8665154.html



版权声明:本文为qq_39375329原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。