文章目录
1 SpringCloud脚本详解
1.1 脚本案例
#!/bin/bash
cd `dirname $0`
CUR_SHELL_DIR=`pwd`
CUR_SHELL_NAME=`basename ${BASH_SOURCE}`
#此处的项目名字 即 maven打包后包名: springcloud-eureka-server-0.0.1-SNAPSHOT.jar
JAR_NAME="项目名称"
JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME
#JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m"
JAVA_MEM_OPTS=""
# 要激活的哪个服务:eureka,eureka2等之类的
SPRING_PROFILES_ACTIV="-Dspring.profiles.active=配置文件变量名称"
#SPRING_PROFILES_ACTIV=""
LOG_DIR=$CUR_SHELL_DIR/logs
LOG_PATH=$LOG_DIR/${JAR_NAME%.*}.log
echo_help(){
echo -e "syntax: sh $CUR_SHELL_NAME start|stop"
}
if [ -z $1 ];then
echo_help
exit 1
fi
if [ ! -d "$LOG_DIR" ];then
mkdir "$LOG_DIR"
fi
if [ ! -f "$LOG_PATH" ];then
touch "$LOG_DIR"
fi
if [ "$1" == "start" ];then
# check server
PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
if [ -n "$PIDS" ]; then
echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}."
exit 1
fi
echo "Starting the $JAR_NAME..."
# start
nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 &
COUNT=0
while [ $COUNT -lt 1 ]; do
sleep 1
COUNT=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}' | wc -l`
if [ $COUNT -gt 0 ]; then
break
fi
done
PIDS=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}'`
echo "${JAR_NAME} Started and the PID is ${PIDS}."
echo "You can check the log file in ${LOG_PATH} for details."
elif [ "$1" == "stop" ];then
PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR:The $JAR_NAME does not started!"
exit 1
fi
echo -e "Stopping the $JAR_NAME..."
for PID in $PIDS; do
kill $PID > /dev/null 2>&1
done
COUNT=0
while [ $COUNT -lt 1 ]; do
sleep 1
COUNT=1
for PID in $PIDS ; do
PID_EXIST=`ps --no-heading -p $PID`
if [ -n "$PID_EXIST" ]; then
COUNT=0
break
fi
done
done
echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}."
else
echo_help
exit 1
fi
1.2 脚本讲解
1.2.1 dirname $0
dirname $0
这个命令写在脚本文件
里才有作用,它返回这个脚本文件放置的目录,并可以根据这个目录来定位所要运行程序的相对位置
(绝对位置除外)
1.2.2 basename
basename
:文件名
1.2.3 ${JAR_NAME%.*}.log
1.2.4 ps --no-heading行处语法
ps
这是报告程序状况的命令语法
--no-heading
此参数的效果和指定"h"参数相同(不显示标题列),只在列表格式方面稍有差异-C java
指定执行指令的名称,并列出该指令的程序的状况,此处相当于过滤出java
信息-f
显示UID,PPIP,C与STIME
栏位--width 1000
设置每列的最大字符数awk '{print $2}'
$2
:表示第二个字段
print $2
: 打印第二个字段
awk '{print $2}' $fileName
: 一行一行的读取指定的文件, 以空格作为分隔符,打印第二个字段
比如有这样一个文件
a1 b1 c1 d1
a2 b2 c2 d2
执行的结果是,输出
b1
b2
1.2.5 nohup处语法
1.2.5.1nohup知识理解
nohup
命令运行由Command
参数和任何相关的Arg
参数指定的命令,忽略所有挂断(SIGHUP
)信号。
在注销后使用nohup
命令运行后台中的程序。要运行后台中的nohup
命令,添加 &
( 表示and
的符号)到命令尾部
。
nohup
是 no hang up
的缩写,就是不挂断
的意思。
nohup
命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup
命令。该命令可以在你退出帐户/关闭
终端之后继续运行相应的进程。
在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out
的文件中。
1.2.5.2 nohup案例
1.2.5.2.1案例一
nohup command > myout.file 2>&1 &
在上面的例子中:
0
–stdin
(standard input)标准输入
1
–stdout
(standard output)标准输出
2
–stderr
(standard error)标准错误
command >out.file
是将command
的输出重定向到myout.file
文件,即输出内容
不打印到屏幕
上,2>&1
是将标准错误(2)
重定向到标准输出(&1)
,但是这里的标准输出已经重定向到了myout.file
文件,因此将标准出错
也输出到myout.file
文件中,最后一个& , 是让该命令在后台执行
1.2.5.2.2 案例二
> /dev/null 2>&1
/dev/null
可以看作黑洞
. 它等价于一个只写文件
. 所有写入它的内容都会永远丢失
. 而尝试从它那儿读取内容则什么也读不到.
/dev/null 2>&1
则表示把标准输出
和错误输出
都放到这个“黑洞”,表示什么也不输出
1.2.5.3 nohup和&的区别
&
: 指在后台运行
,但当用户退出(挂起
)的时候,命令自动也跟着退出nohup
:不挂断的运行
,注意并没有后台运行
的功能,就是指,用nohup
运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH
连接都不会影响它的运行,注意了nohup
没有后台运行的意思;&
才是后台运行
1.3 脚本报错
1.3.1 启动报错
linux
启动脚本时报错:-bash: ./bin/start.sh: /bin/bash^M: bad interpreter: No such file or directory
原因
是文件的格式是dos
,修改为unix
就OK
了
具体操作步骤:
- 查看文件格式 用
vim
打开出错的文件 按ESC
键 再按shift + :
输入set ff
回车 可以看见 该文件的格式fileformat=dos
- 按
shift + :
输入set ff=unix
回车 发现没反应,那就对了。 - 可以按
shift + :
到行低,set ff
查看fileformat=unix