写点什么

编写 Java 程序启动脚本最佳实践

作者:WindFlying
  • 2021 年 11 月 25 日
  • 本文字数:1428 字

    阅读完需:约 5 分钟

在实际的工作中经常会遇到给 java 项目编写启动脚本,现在就来记录一下编写此类脚本的最佳实践。先上一个模板:

#!/bin/bash
# 参数校验如果校验失败输出脚本使用方法
bin=`dirname "${BASH_SOURCE-$0}"`script_prefix=`cd "$bin"; pwd`
# 或 nohup java {虚拟机参数} -jar {jar包路径} {参数} > "${script_prefix}"/start.out 2>&1 &nohup java {虚拟机参数} -cp {classpath} {主类} {参数} > "${script_prefix}"/start.out 2>&1 &
复制代码

参数校验的最佳实践还没有仔细研究,有了一些实践后再做补充。下面解释一下脚本中的一些关键点。

  • nohup 是不挂断的意思( no hang up),用它启动进程会忽略所有的挂(SIGHUP)信号,比如用户退出终端进程不会结束

  • 命令最后面的 &,表示后台运行,nohup 和 &结合使用就是让进程在后台运行且不挂断。

  • 从上面模板可以看到启动进程时把标准输出重定向到文件"${script_prefix}"/start.out,那么 2>&1 又是什么呢?这里解释一下,在 shell 中标准输入和输出是这样表示的:0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) 。2>&1 就是把 stderr 重定向到 stdout,即 stdout 和 stderr 输出到同一个地方。

  • 另外在上面模板中 start.out 所在目录是脚本所在的上下文环境,它是通过第 5、6 行代码生成的,${BASH_SOURCE-$0}变量表示脚本调用的路径,dirname "${BASH_SOURCE-$0}"即脚本所在目录,然后通过第 6 行代码生成脚本所在目录的全路径。下面我们给出第 5、6 行代码的测试例子。

有一个/home/test/目录下的脚本 test.sh:

#!/bin/bash
echo "${BASH_SOURCE-$0}"curr=`dirname "${BASH_SOURCE-$0}"`echo "${curr}"curr_dir=`cd "$curr"; pwd`echo "$curr_dir"
复制代码

如果执行脚本:

cd /home/test/ && ./test.sh
复制代码

输出如下:

./test.sh./home/test
复制代码

如果执行脚本:

/home/test/test.sh
复制代码

输出如下:

/home/test/test.sh/home/test/home/test
复制代码

你会发现调用脚本的路径不同,${BASH_SOURCE-$0}变量的值也不同,但最终输出的全路径是一致的,所以可以放心使用。

参考:1.https://www.jianshu.com/p/93a45927f013

2.https://www.cnblogs.com/greencollar/p/13668464.html#:~:text=Linux%20nohup%20%E5%AE%9E%E7%8E%B0%E5%91%BD%E4%BB%A4%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C%E5%B9%B6%E8%BE%93%E5%87%BA%E6%88%96%E8%AE%B0%E5%BD%95%E5%88%B0%E6%8C%87%E5%AE%9A%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6.%20%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4%EF%BC%9Anohup.%20nohup%E5%91%BD%E4%BB%A4%EF%BC%9Anohup%E6%98%AF%E4%B8%8D%E6%8C%82%E6%96%AD%E7%9A%84%E6%84%8F%E6%80%9D%20%28%20no%20hang,%E8%AF%A5%E5%91%BD%E4%BB%A4%E5%BF%BD%E7%95%A5%E6%89%80%E6%9C%89%E6%8C%82%EF%BC%88SIGHUP%EF%BC%89%E4%BF%A1%E5%8F%B7%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%BD%A0%E9%80%80%E5%87%BA%E5%B8%90%E6%88%B7%2F%E5%85%B3%E9%97%AD%E7%BB%88%E7%AB%AF%E4%B9%8B%E5%90%8E%E7%BB%A7%E7%BB%AD%E8%BF%90%E8%A1%8C%E7%9B%B8%E5%BA%94%E7%9A%84%E8%BF%9B%E7%A8%8B%E3%80%82.%20%E8%AF%A5%E5%91%BD%E4%BB%A4%E7%9A%84%E4%B8%80%E8%88%AC%E6%A0%BC%E5%BC%8F%E4%B8%BA%EF%BC%9A.%20nohup%20yourcommand%20%26.%20%23%20yourcommand%3A%E5%90%AF%E5%8A%A8%E5%AF%B9%E8%B1%A1%E5%91%BD%E4%BB%A4%E3%80%82.%20%E5%8F%AF%E4%BB%A5%E8%B7%9F%E8%AF%A5%E5%91%BD%E4%BB%A4%E9%9C%80%E8%A6%81%E7%9A%84%E5%90%84%E7%A7%8D%E5%8F%82%E6%95%B0%E3%80%82.

发布于: 3 小时前阅读数: 7
用户头像

WindFlying

关注

风起云端 2018.04.19 加入

有几把刷子。。。

评论

发布
暂无评论
编写Java程序启动脚本最佳实践