驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
CentOS 开机启动指定 jar 包
/  

CentOS 开机启动指定 jar 包

开篇

Linux服务器上我们通常需要在开机后自动启动相关的程序。

本文主要整理和记录下工作中用到的关于这方面的知识,方便后续查找。

方法一:通过服务启动

编写启动脚本:xxx-start.sh

启动脚本的样例代码如下所示:

# 配置环境,请设置 Java 环境,即使你在系统中已经设置成功
JAVA_HOME=/usr/java/jdk1.8.0_171
JRE_HOME=/usr/java/jdk1.8.0_171/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

# 启动 jar 包。
nohup java -jar /java-service/xxx.jar > /java-service/logs/xxx.log &
echo $! > /var/run/xxx.pid

上述脚本中有几个需要注意的细节:

  1. 必须在程序运行前指定环境变量,可能原因是:开机启动的服务可能没有办法读取设置好的环境变量。
  2. 启动 jar 包的指令为为nohup指令,该命令后续讲解。
  3. 进程 id输出到 /var/run/目录中,文件xxx.pidxxx表示服务名称。

nohup和&指令

在上述脚本中有一句非常关键的:

nohup java -jar /java-service/xxx.jar > /java-service/logs/xxx.log &

其中 nohup常常搭配&一起使用:

nohup command > xxx.log &
  1. nohup 表示的关闭 shell 后进程仍然保持执行。
  2. & 表示的是后台运行,当使用 Ctrl+C 也不会退出。
  3. 所以通过nohup加上&就达到了既不受shell关闭影响,也做到了不受Ctrl+C退出的影响。
  4. xxx.log 表示之前在控制台输出的文件输出到 xxx.log

编写停止脚本:xxx-stop.sh

PID=${cat /var/run/xxx.pid}
kill -15 $PID
  1. 因为我们将进程 id输出到了/var/run/xxx.id中,所以可以通过cat命令获取。
  2. 通过 kill指令对服务进行关闭。

编写开机启动:xxx.service

[Unit]
Description=service for description

[Service]
Type=forking
ExecStart=/java-service/xxx-start.sh
ExecStop=/java-service/xxx-stop.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

关于这个文件的详细参考说明可以查看此文档:https://www.csdn.net/article/2015-02-27/2824034

服务开启和关闭指令

# 临时启动服务指令
system start xxx
# 允许开机启动
systemctl enable xxx
# 关闭开机启动
systemctl stop xxx

方法二:rc.local 添加脚本

  1. 编写启动脚本:xxx-start.sh 这一步同方法一,没有改变。

  2. 对脚本添加可执行权限

chmod +x /java-service/xxx-start.sh
  1. rc.local标记为可执行文件。
chmod +x /etc/rc.d/rc.local
  1. /etc/rc.d/rc.local文件末尾追加如下脚本
/java-service/xxx-start.sh

总结

上面提出了2个办法,一个办法是通过服务启动,另外一个办法是通过启动脚本启动。

骐骥一跃,不能十步。驽马十驾,功在不舍。