一、启动脚本

Springboot 项目打成jar包后,在Linux环境上一般有如下几种启动方式:

1. “java -jar XXX.jar ”

命令结尾没有 “&” ,表示在当前ssh窗口,可按CTRL + C打断程序运行,或者直接关闭窗口,则程序直接退出

2. java -jar app.jar &

表示在当窗口关闭时,程序才会中止运行。&代表让该命令在后台执行。

3. nohub 方式启动:

& 表示后台运行,但是当用户推出终端或挂起的时候,命令也跟着退出。而nohub的意思就是 no hung up (不挂起),命令永久的执行下去,和用户终端没有关系。

nohup java -Dfile.encoding=UTF-8 -Xms2000m -Xmx2000m -jar app.jar >/dev/null 2>&1 &

参数详解:nohub : 不挂断地运行命令-Dfile.encoding=UTF-8: 字符集(可以不用设置)-Xms2000m:启动分配内存-Xmx2000m:运行最大内存-jar :jar方式启动

/dev/null >2>& 1 : 一般情况下是指定日志输出位置例如:nohup java -jar XXX.jar > Log.log &

标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。“>dev/null 2>&1” :将 标准错误 (stderr) 2 重定向到 (stdout ) 1 最终输出到 Log.log 中

dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

最后说说为什么要不想输出文件了还需需要这样做:nohub 命令缺省日志的情况下回默认将日志输出到 nohup.out 中所以要指定日志,但是不想输出日志的情况下就可以如上所做。可以创建 start.sh 文件,然后将nohub 启动命令写入即可。

二、停止脚本

ps -ef | grep app.jar | grep -v grep | awk '{print $2}' | xargs kill

命令详解:ps -ef | grep app.jar这不不用多说,就是查找app.jar 这个进程的相关信息。其中 | 是 管道符,意思就是上一条命令的输出作为下一条命令的参数。也就是说这个命令其实是两条命令。ps -ef 是第一步代表查找所有进程grep app.jar 第二步代表过滤出所有含有app.jar的进程

举个例子就是:

ps -ef|grep app.jar
root      6999     1  0 Nov04 ?        00:06:23 java -Dfile.encoding=UTF-8 -Xms2000m -Xmx2000m -jar app.jar
root      8474 29928  0 10:55 pts/1    00:00:00 grep --color=auto app.jar

但是为什么会出现两个进程呢,其中一个是 java 另一个是grep.其实在执行grep app.jar 的时候,本身也是一个进程,并且包含了app.jar 关键字,所以筛选的时候就显示出来了。其实不管有没有app.jar 这个进程,都会显示出来,随便编一个aaaa.jar 执行:

ps -ef|grep aaa.jar

root     14003 29928  0 11:04 pts/1    00:00:00 grep --color=auto aaa.jar

杀掉进程,需要知道进程号,目前有两个进程,就需要过滤掉grep这个进程。grep -v grep :就是去除去包含grep的进程 。与上面的命令通过 | 连接后的执行结果如下:

ps -ef | grep app.jar | grep -v grep
root      6999     1  0 Nov04 ?        00:06:24 java -Dfile.encoding=UTF-8 -Xms2000m -Xmx2000m -jar app.jar


可以看到已经将java进程过滤出来了。awk '{print $2}' 就是根据分割符打印出第二个参数,这里就是进程号。

xargs kill 中, xargs 是命令的作用,是将标准输入转为命令行参数。有的命令是不支持将标准输入作为参数的,也就是不支持 | 作为输出的。上面的grep 支持。什么是标准输入不多说了。这个命令也就可以看做前一步不是输入了进程号么,但是不能通过 | 传递给 kill 这个命令,只能通过xargs 转化一下。

脚本执行如果提权限问题 执行 chmod u+x *.sh即可