脚本文件
#!/usr/bin/env bash
INPUT=$2
FILE_PATH=`readlink -f ${INPUT}`
SERVICE=${INPUT##*/}
SERVICE_NAME=${SERVICE%.*}
DEPLOY_DIR=`pwd`
#JVM_OPTS="-server -Xms256m -Xmx512m -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m"
JVM_OPTS="-server -Xms256m -Xmx512m"
if [[ "$1" = "" ]];
then
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
exit 1
fi
if [[ "$SERVICE" = "" ]];
then
echo -e "\033[0;31m 未输入应用名 \033[0m"
exit 1
fi
LOGS_DIR="$DEPLOY_DIR/logs/$SERVICE_NAME"
echo "$LOGS_DIR"
if [[ ! -d "$LOGS_DIR" ]]; then
mkdir -p ${LOGS_DIR}
fi
LOG_PATH="$LOGS_DIR/"
pid=0
start()
{
checkPid
if [[ ! -n "$pid" ]]; then
BUILD_ID=dontKillMe nohup java ${JVM_OPTS} -jar ${FILE_PATH} >> ${LOG_PATH} 2>&1 &
echo "$SERVICE_NAME is starting you can check the $LOG_PATH"
else
echo "$SERVICE_NAME is runing PID: $pid"
fi
}
checkPid()
{
pid=`ps -ef |grep ${FILE_PATH} |grep -v grep |awk '{print $2}'`
}
stop()
{
checkPid
if [[ ! -n "$pid" ]]; then
echo "$SERVICE_NAME not runing"
else
echo "$SERVICE_NAME stop..."
kill -9 ${pid}
fi
}
restart()
{
stop
sleep 2
start
}
status()
{
checkPid
if [[ ! -n "$pid" ]]; then
echo "$SERVICE_NAME not runing"
else
echo "$SERVICE_NAME runing PID: $pid"
fi
}
case $1 in
start) start;;
stop) stop;;
restart) restart;;
status) status;;
*) echo "require start|stop|restart|status" ;;
esac
启动命令:./ start|stop|restart|status
命令解释及说明
#!/usr/bin/env bash
# 启动:./ restart xxx/
# 接收第二个参数,获取启动文件路径
INPUT=$2
# 获取文件的绝对路径
FILE_PATH=`readlink -f ${INPUT}`
# 获取文件名及后缀(),去掉文件最后一个/及其左边的字符串
SERVICE=${INPUT##*/}
# 获取文件名(filename),去掉最后一个.极其右边的字符串
SERVICE_NAME=${SERVICE%.*}
DEPLOY_DIR=`pwd`
#JVM_OPTS="-server -Xms256m -Xmx512m -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m"
# 定义内存大小
JVM_OPTS="-server -Xms256m -Xmx512m"
# 判断启动类型是否为空
if [[ "$1" = "" ]];
then
# echo -e 激活转义字符输出
# 格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m"
# 颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
# xit命令用于退出目前的shell,0执行成功,1执行失败
exit 1
fi
if [[ "$SERVICE" = "" ]];
then
echo -e "\033[0;31m 未输入应用名 \033[0m"
exit 1
fi
# 日志文件目录
LOGS_DIR="$DEPLOY_DIR/logs/$SERVICE_NAME"
echo "$LOGS_DIR"
# 判断日志目录是否为目录,不为目录则创建文件
if [[ ! -d "$LOGS_DIR" ]]; then
mkdir -p ${LOGS_DIR}
fi
LOG_PATH="$LOGS_DIR/"
pid=0
# 启动函数
start()
{
checkPid
# 判断进程是否为空
if [[ ! -n "$pid" ]]; then
# > 和 >> 区别,> 当文件存在时,会先删除原文件再重新创建文件, >> 会在目标原有内容后追加内容
BUILD_ID=dontKillMe nohup java ${JVM_OPTS} -jar ${FILE_PATH} >> ${LOG_PATH} 2>&1 &
echo "$SERVICE_NAME is starting you can check the $LOG_PATH"
else
echo "$SERVICE_NAME is runing PID: $pid"
fi
}
checkPid()
{
# #判断进程是否存在,如果不存在就启动它
pid=`ps -ef |grep ${FILE_PATH} |grep -v grep |awk '{print $2}'`
}
# 停止函数
stop()
{
checkPid
# 判断进程是否为空
if [[ ! -n "$pid" ]]; then
echo "$SERVICE_NAME not runing"
else
echo "$SERVICE_NAME stop..."
# 杀死进程
kill -9 ${pid}
fi
}
# 重启函数
restart()
{
stop
sleep 2
start
}
status()
{
checkPid
# 判断进程是否为空
if [[ ! -n "$pid" ]]; then
echo "$SERVICE_NAME not runing"
else
echo "$SERVICE_NAME runing PID: $pid"
fi
}
# 判断启动命令第一个参数是启动/重启/停止
case $1 in
start) start;;
stop) stop;;
restart) restart;;
status) status;;
*) echo "require start|stop|restart|status" ;;
esac
语句说明
1、使用bash语法执行
#!/bin/bash
#!/bin/bash 是直接指定了应该去哪里找 bash, #!/usr/bin/env bash 则是告诉系统去 $PATH 包含的目录中找(优先使用)
2、启动脚本
sh filename 表示执行sh脚本文件
sh -x filename 表示查看这个脚本执行过程
3、定义变量
定义变量的格式为: 变量名=变量的值
d1=""
4、在脚本中使用变量 $变量名
$d1
5、获取键盘输入的值 read
read x
表示接收键盘输入的值x
6、echo 输出字符串(双引号完全可以省略)
echo "It is a test"
输出变量,如:
read name
echo "$name It is a test"
原样输出字符串,不进行转义或取变量(用单引号)
echo '$name'
显示命令执行结果(反引号 `, 而不是单引号 ')
echo `date`
数学计算要用 [] 括起来且外头带一个 $
如:sum=$[5+4]
7、文件比较运算符
-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename可写,则为真 [ -w /var/ ]
-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]
8、$( )与` `(反引号)都是用来作命令替换的,${ }变量替换
$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围
9、查看进程
ps -ef | grep data-sync-server-1.0.
10、启动jar
nohup java ${JVM_OPTS} -jar ${FILE_PATH} >> ${LOG_PATH} 2>&1 &
1、整数比较:
-eq 等于,如:if [ "$a" -eq "$b" ] 或 if [ $a -eq $b ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
== 等于,如:if if (("$a" == "$b"))
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
特别说明的是(())字符和括号之间不需要留空格,但[[ ]],[]要求比较严格,需要留空格。
2、字符串比较,上面的-eq,-nq等公式只适用于数字比较,不适用于字符比较
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
[[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true
[[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
[ $a == z* ] # File globbing 和word splitting将会发生
[ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
3、括号之间的区别:
[[ ]],[]对括号内变量要求严格且且敏感,但(())则相对宽松一些
[plain] view plain copy
1、if [[ $a == $b ]] 和 if [[ $a == $b ]] 等价
但if [[ $a == $b ]] 和if [[ a == b ]] 不等价
2、if (($a == $b)) 和 if (($a = $b))等价
if (($a == $b)) 和 if ((a == b)) 等价
4、多条件判断:
&&和||适用于[[ ]]和(),-a和-o适用于[]中
-a 与
-o 或
!非
举例如下:
[plain] view plain copy
if ((i == 1)) 和 if [ "$i" == 1 ]等价
if [[ "$i" = 1 && "$j" = 2 ]] 和 if ((i = 1)) || ((j = 2))
5、其它说明:
!= 不等于,如:if [ "$a" != "$b" ]
这个操作符将在[[]]结构中使用模式匹配.
< 小于,在ASCII字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]结构中"<"需要被转义.
> 大于,在ASCII字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
/qq13650793239/article/details/105745576
shell中各种括号的作用详解()、(())、[]、[[]]、{}
https:///article/
Linux—shell中$(( ))、$( )、``与${ }的区别
/chengd/p/
先赋值一个变量为一个路径,如下:
file=/dir1/dir2/dir3/
命令 解释 结果
${file#*/} 拿掉第一条 / 及其左边的字符串 dir1/dir2/dir3/
[root@localhost ~]# echo ${file#*/}
dir1/dir2/dir3/
${file##*/} 拿掉最后一条 / 及其左边的字符串
[root@localhost ~]# echo ${file##*/}
${file#*.} 拿掉第一个 . 及其左边的字符串
[root@localhost ~]# echo ${file#*.}
${file##*.} 拿掉最后一个 . 及其左边的字符串 txt
[root@localhost ~]# echo ${file##*.}
txt
${file%/*} 拿掉最后一条 / 及其右边的字符串 /dir1/dir2/dir3
[root@localhost ~]# echo ${file%/*}
/dir1/dir2/dir3
${file%%/*} 拿掉第一条 / 及其右边的字符串 (空值)
[root@localhost ~]# echo ${file%%/*}
(空值)
${file%.*} 拿掉最后一个 . 及其右边的字符串 /dir1/dir2/dir3/
[root@localhost ~]# echo ${file%.*}
/dir1/dir2/dir3/
${file%%.*} 拿掉第一个 . 及其右边的字符串 /dir1/dir2/dir3/my
[root@localhost ~]# echo ${file%%.*}
/dir1/dir2/dir3/my
记忆方法如下:
# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配;两个符号是最大匹配
*是用来匹配不要的字符,也就是想要去掉的那部分
还有指定字符分隔号,与*配合,决定取哪部分
相关资料:
Linux脚本中$#、$0、$1、$@、$*、$$、$? - 曲项向天歌 - 博客园
Linux—shell中$(( ))、$( )、``与${ }的区别 - chengd - 博客园
https:///article/