case..esac 与 开机启动

标题是‘case..esac 与 开机启动’,但是两者并没有关系。
本文主要记录了 使用case..esac条件语句写一个Shell脚本 管理一个Java程序,并使其能跟随系统启动

case..esac

新建Shell文件 /etc/init.d/rc.java_program,(rcrunlevel control 的意思)。文件内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash

JAVA_HOME="/opt/websuite/jdk" # 你的JDK目录
PROGRAM_HOME="/home/kail/java_program" # 你的应用程序目录
PROGRAM_NAME="java_program-1.0.0.jar" # 你的jar包名称
PROGRAM_LOG="$PROGRAM_HOME/java_program.log" # 日志路径

case $1 in # $1 获得第一个命令行参数
start) # 当参数是 start 的时候,执行以下脚本( java -jar ***.jar >> file.log )
nohup "$JAVA_HOME/bin/java" -jar "$PROGRAM_HOME/$PROGRAM_NAME" >> $PROGRAM_LOG 2>&1 &
# nohup 和 & 一前一后,使进程后台运行
;;

stop) # 当参数是 stop 的时候,执行以下脚本
"$JAVA_HOME/bin/jcmd" | grep "$PROGRAM_NAME" | awk '{print $1}'| xargs kill -9 # 获取进程ID,kill掉
;;

status)
"$JAVA_HOME/bin/jcmd" | grep "$PROGRAM_NAME" # 获取进程信息
;;

restart)
$0 stop # $0 指shell本身文件名,后面加上stop参数,相当于执行 上面 stop 里面的逻辑
sleep 10s # 等待10秒,
$0 start # 启动
;;

log)
$0 status
sleep 2s # 输出进程信息后,等待两秒
tail -fn 200 $PROGRAM_LOG # 滚动查看日志文件
;;

*) # 如果以上 {start|stop|status|restart|log} 都没有匹配到,则执行该逻辑
echo "Usage: $0 {start|stop|status|restart|log}"
exit 1 # 非正常退出码
esac # case 倒过来写 case结束


exit 0 # 正常退出状态码

接下来可以使用 /etc/init.d/rc.java_program start(或service rc.java_program start) 启动程序,/etc/init.d/rc.java_program stop(或service rc.java_program stop) 关闭程序….

跟随系统启动

编辑 /etc/rc.local 文件,在最后一行新增 /etc/init.d/rc.java_program restart
/etc/rc.local Shell文件会在系统启动完成之后执行。详请查看拓展阅读。

$ reboot 重启,使用 /etc/init.d/rc.java_program status 看一下进程启动了没有吧。

拓展阅读

利用 case ….. esac 判断

使用者自订启动启动程序 (/etc/rc.d/rc.local)

daemon 的启动脚本与启动方式

Systemd 入门教程:命令篇
Systemd 入门教程:实战篇