#!/bin/bash
#通常用作注释,#和!连在一起并且放在首行表示该脚本由什么去解释,标志着这是一个shell script
详细解释:https://kknews.cc/code/96vkgol.html
echo "测试打印输出"
echo是linux下的打印输出命令,命令的输出内容如果没有特殊含义,则原内容输出到屏幕;如果输出内容有特殊含义,则输出打印其含义
更多使用方式:http://c.biancheng.net/view/934.html
更多使用方式:https://www.jb51.net/article/220865.htm
判断服务是否已开启:通过ps命令查看服务是否正在运行,以查询mysql为例
如果存在查询结果则表示服务正在运行,已开启
appName=mysql
port=3306
ps -ef | grep $appName| grep $port| grep -v grep | grep -v sudo
grep -v 参数 : 过滤掉指定参数的查询结果 例如grep -v grep 过滤掉查询结果中包含grep的
查询到服务的进程信息后如上图所示
列名从左到右依次是UID PID PPID C STIME TTY TIME CMD
pid即进程id,我们可以通过pid是否存在 判断 服务是否正在运行
获取进程id,我们可以清楚的看到pid在查询结果信息的第二列
pid=$(ps -ef | grep $appName | grep $port | grep -v grep | grep -v sudo | awk '{print $2}')
awk '{print $2}' 是获取当前行的第二列,也就是pid
那么如果查询结果pid不为空则说明服务已开启
在中括号里通过-z判断值是否为空 更多使用方式:https://www.jb51.net/article/186182.htm
变量的值,为空,返回0,为true
变量的值,非空,返回1,为false
if [ -z "$pid" ]
then
echo "服务没有运行"
else
echo "服务正在运行"
fi
稍稍改造下,写个简单完整的启动脚本
#!/bin/bash
#jar包名称
appName=test01
#服务端口号
port=8888
#查询服务是否正在运行
pid=$(ps -ef | grep $appName | grep $port | grep -v grep | grep -v sudo | awk '{print $2}')
if [ -z "$pid" ]
then
nohup java -Xmx1g -Xms1g -jar -Dserver.port=$port -Dspring.profiles.active=dev -Dlogging.path=./logs /home/data/app/test01/$appName.jar 1>/dev/null 2>/dev/null &
else
kill -9 $pid
nohup java -Xmx1g -Xms1g -jar -Dserver.port=$port -Dspring.profiles.active=dev -Dlogging.path=./logs /home/data/app/test01/$appName.jar 1>/dev/null 2>/dev/null &
fi
将脚本上传到服务器上,如果提示没有权限运行,可以查看是否有读写权限
ls -l test.sh
chmod 777 test.sh
nohup命令
方式一:java -jar xxx.jar 这种方式启动是在前台运行,命令行会被占用,即当前ssh窗口会被锁定 持续输出运行信息,这样我们就不能在这个窗口下执行其他命令,如果要继续在当前窗口下操作命令,按下ctrl+c 打断程序的运行,这种方式启动关闭窗口也会终止程序
方式二:java -jar xxx.jar & 这种方式启动是后台运行(&),命令行不会被占用 但是关闭当前窗口,程序会被终止
方式三:nohup java -jar xxx.jar & 后台启动,命令行不会被占用,关闭窗口也不会终止程序nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行,当用 nohup 命令执行作业时,缺省情况下该作业的所有输出被重定向到nohup.out的文件中,除非另外指定了输出文件
nohup java -jar xxx.jar >/dev/null 2>&1 &
>/dev/null 2>&1是将标准输出和错误输出都重定向/dev/null,/dev/null可以理解为垃圾桶、黑洞,将无用的输出都重定向到这里,程序运行产生的日志我们通过日志框架的相应策略放到指定位置
注:1>/dev/null 2>/dev/null 和 >/dev/null 2>&1含义相同,只是写法不同
详细介绍:https://www.jb51.net/article/169837.htm