- # 配置运行日志输出的路径
- export log_path=/usr/local/project/study-pro/logs
- # 当前服务运行的脚本命令
- export exec_cmd="nohup /usr/local/project/openjdk-8/bin/java -jar /usr/local/project/study-pro/study-pro-0.0.1-SNAPSHOT.jar"
- # 获取脚本所在的目录
- CUR_DIR=$(dirname $0)
- # 进入到该目录运行,这样可以规避绝对路径的问题,你的脚本迁移到任何目录都可以正常运行
- cd ${CUR_DIR}
-
- # 该函数running正常退出,not running则退出非0值
- check_server_is_running() {
- [[ ! -f "pid" ]] && touch pid
-
- # 获取
- PID=$(cat pid)
-
- # 首先判断pid是否存在
- if [ "${PID}" = "" ]
- then
- echo "server is not running."
- return 1
- fi
-
- # 再判断指定的PID是否在当前目录运行,防止因历史异常原因遗留了失效PID,正好该PID又被其他进程占用,造成误杀。
- if [[ -d /proc/${PID}/cwd ]] && ls -ahl /proc/${PID}/cwd | grep -q "${CUR_DIR}"
- then
- echo "server is running."
- return 0
- else
- # 清空失效的进程号并异常退出
- echo "" > pid
- return 1
- fi
- }
-
- start() {
- # 启动前判断日志目录是否存在,不存在就创建
- [[ ! -d "${log_path}" ]] && mkdir -p ${log_path}
-
- # 启动服务
- ${exec_cmd} > ${log_path}/start.log 2>&1 &
-
- # 保存PID,以供stop使用
- PID=$!
- echo "server start succ, PID=${PID}!"
- echo "${PID}" > pid
- }
-
-
-
- stop() {
- # get pid
- PID=$(cat pid)
- kill -9 ${PID}
- }
-
-
- case C"$1" in
- Cstart)
- # ||:前一个运行失败后,才运行后面一个脚本。单进程执行。若遇到第一个执行成功的脚本后,后面的脚本不再执行。
- check_server_is_running || start
- echo "start done."
- ;;
- Cstop)
- # &&:前一个运行成功后,才运行下一个。单进程执行,若中途某个脚本执行报错,后面的脚本不再执行
- check_server_is_running && stop
- echo "stop done."
- ;;
- Crestart)
- check_server_is_running && stop
- check_server_is_running || start
- echo "restart done."
- ;;
- C*)
- echo "Usage: $0 {start|stop|restart}"
- ;;
- esac
chmod -R +x service.sh
执行脚本 | 说明 |
./service.sh start | 服务启动 |
./service.sh stop | 服务停止 |
./service.sh restart | 服务重启 |
./service.sh start