PS:禁止拷贝形式转载,转载请以URL形式
1.简介
解决通过sh脚本控制启停Java jar程序,导致java程序工作目录不固定。
执行sh脚本时,理想它的工作空间是在当前程序/脚本(默认它们同级)所放置的目录,
实际上它是当前执行sh脚本所处的目录(root目录下执行home目录下的脚本,则当前工作空间为root)。
2.解决问题
- 通过sh脚本启停jar包,传递参数等。
- sh脚本执行jar时,工作空间不在当前脚本文件目录。(导致jar程序的当前运行空间不是sh脚本文件目录,如log4日志保存的日志路径使用./logs保存。本意应该保存在sh文件同级目录,但是实际会跟随sh脚本工作空间路径进行保存)
3.解决思路(对应问题)
- 编写脚本,控制参数。
- 在sh脚本中获取脚本文件目录,并进入该目录(修改工作空间)。
4.demo
目录环境
/root/demo/
--------------/logs
--------------/jre1.8/
----------------------/bin/java
--------------/demo.jar
--------------/start.sh执行
root@dyf:~# /root/demo/start.sh xxxx
Usage: {start|stop|status}
root@dyf:~# /root/demo/start.sh status
[demo.jar] not running!
root@dyf:~# /root/demo/start.sh start
/root/demo/jre1.8/bin/java -server -Xms512m -Xmx512m -jar /root/demo/demo.jar >>/dev/null &
[demo.jar-27330]. start!
root@dyf:~# /root/demo/start.sh start
[demo.jar-27330]. already start.
root@dyf:~# /root/demo/start.sh status
[demo.jar-27330]. is running!
root@dyf:~# /root/demo/start.sh stop
[demo.jar-27330]. stop!
root@dyf:~# /root/demo/start.sh status
[demo.jar] not running!
root@dyf:~# /root/demo/start.sh stop
[demo.jar] not running!
- 脚本
#!/bin/sh
# 解决问题2。获取脚本文件目录,并进入该目录。
cd "$(dirname "$0")"
APP="demo.jar"
APP_PATH=$(pwd)/${APP}
APP_PID=$(pgrep -f ${APP})
JVM_PARM="-server -Xms512m -Xmx512m"
JRE_PATH="/root/demo/jre1.8/bin/java"
#程序启动方法
start() {
if [ -n "${APP_PID}" ]; then
echo "[${APP}-${APP_PID}]. already start."
else
nohup ${JRE_PATH} ${JVM_PARM} -jar ${APP_PATH} "$*" >>/dev/null &
echo "${JRE_PATH} ${JVM_PARM} -jar ${APP_PATH}" "$*" '>>/dev/null &'
APP_PID="$!"
echo "[${APP}-${APP_PID}]. start!"
fi
}
#停止程序
stop() {
if [ -z "${APP_PID}" ]; then
echo "[${APP}] not running!"
else
kill -9 ${APP_PID}
echo "[${APP}-${APP_PID}]. stop!"
fi
}
#程序运行状态
status() {
if [ -z "${APP_PID}" ]; then
echo "[${APP}] not running!"
else
echo "[${APP}-${APP_PID}]. is running!"
fi
}
case $1 in
start)
start
;;
stop)
stop
;;
status)
status
;;
*)
echo "Usage: {start|stop|status}"
;;
esac
exit 0