下面的各个的linux的shell脚本,是我在实践中用到的,积累下来。部分脚本都做了修改,删除一些有坑的操作。
if else的判断,判断文件是否存在,判断数字大小。下面是shell脚本
#判断文件是否存在 且是否是文件
if [ -f test2.sh ]; then
echo "file exist"
else
echo "file does not exist "
fi
#判断文件是否存在 且是否是文件
if [ -f test.sh ]; then
echo "是文件"
fi
#键盘输入内容
echo -n "plese input a number "
read num
#判断输入内容的数字大小
if [ "$num" -lt "10" ]; then
echo "little 10"
elif [ "$num" -gt "10" ]; then
echo "great 10"
else
echo "nicai"
fi
修改文件名字
mv central.war09 central.war
找到正在运行的war包的进程,然后结束该进程。“|”表示一个管道的意思,可以理解为东西从管s道的一边流向另外一边。
ps -ef | grep central.war
kill -9 pid
运行jar文件
java -jar central.jar
一个xxx.sh脚本文件,要求是输出某个文件夹下一个文件内容到命令行界面。tail -n 表示尾部输入多少行,这里表示的是从尾部倒数10行
#!/bin/sh
cd /home/chenrui/Documents/my_shell
tail -n 10 test.sh
终端输出内容 输入到指定文件下
一个xxx.sh脚本文件,sh脚本中的命令可能会往终端中输出内容,现在的要求是sh脚本继续执行,输出的内容不需要向终端输出,输出到指定的文件夹内。
在shell命令中,通常会出现类似这样子的命令:1>&2,2>&1,2>,1>,那么这些数字的意思是下面黑体字。
0 为stdin标准输入
1 stdout标准输出
2 stderr标准错误 //输出一些错误的信息
&>error.log 表示是把标准输出和错误输出都输入到文件error.log中;
1>&2 意思是把标准输出重定向到标准错误;
2>&1 意思是把标准错误输出重定向到标准输出。
如ls某个不存在的文件
chenrui@ubuntu:~/Documents/my_shell$ ls hahah
ls: cannot access 'hahah': No such file or directory
那么使用
chenrui@ubuntu:~/Documents/my_shell$ ls haha 2>error.log
此刻查看error.log内容," 2>error.log " 是表示把错误的内容输出到error.log里了。
chenrui@ubuntu:~/Documents/my_shell$ more error.log
ls: cannot access 'haha': No such file or directory
同理,如果要是正确的内容输入到error.log里去 2>error.log是输入不进去,直接在终端显示了。不信你可以试试,哈哈,试一下吧(篇幅有限我不能再填上去了)
在sh中运行jar包,然后把jar中的控制台输出输出到指定文件内
jarPath=/home/chenrui/java/
cd $jarPath
java -jar xxxx.jar >> error.log 2>&1
执行这个sh文件后,可以看到终端不允许你继续操作下条指令。需要在java -jar xxxx.jar >> error.log 2>&1的后面再加一个&符号就行了。java -jar xxxx.jar >> error.log 2>&1 &
我这里有一个memeda.war包,从jenkins构建以后生成的名字为memeda.war_newbuild。此时需要将新的newbuild包改名部署,老包也要改名备份
- 第一种方式:根据memeda.war包启动的端口找到对应的pid,然后kill
- 第二种方式:根据ps memeda.war命令找到对应的pid,然后kill
第一种方式
##############根据端口号结束进程##################
port=25010
#根据端口号查询对应的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
#杀掉对应的进程,如果pid不存在,则不执行
if [ -n "$pid" ]; then
kill -9 $pid;
echo "结束端口 $port 进程:"$pid;
ps -ef | grep memeda.war
if [ -e memeda.war_newbuild ]; then
echo "开始启动"
mv memeda.war "memeda.war_"`date "+%Y%m%d_%H%M%S"`
mv memeda.war_newbuild memeda.war
./start.sh
ps -ef | grep memeda.war
echo "启动完成"
fi
fi
第二种方式
##############根据ps命令结束进程##################
#根据war包查询对应的pid
pid=$(ps -ef | grep memeda.war | grep java | awk '{print $2}');
#杀掉对应的进程,如果pid不存在,则不执行
if [ -n "$pid" ]; then
kill -9 $pid;
echo "结束进程:"$pid;
ps -ef | grep memeda.war
if [ -e memeda.war_newbuild ]; then
echo "开始启动"
mv memeda.war "memeda.war_"`date "+%Y%m%d_%H%M%S"`
mv memeda.war_newbuild memeda.war
./start.sh
ps -ef | grep memeda.war
echo "启动完成"
fi
fi
注:start.sh脚本的内容与解释,在本文的 “终端输出内容 输入到指定文件下” 有解释。
这条命令:mv memeda.war "memeda.war_"`date "+%Y%m%d_%H%M%S"` ,在date中有个长得像单引号的,那个不是单引号
那个是tab键上面,1键左边的那个标号。切记不是单引号!
直接根据ps命令结束一个进程
ps -ef | grep memeda.war | grep -v grep | awk '{print $2}' | xargs kill -9
服务器定时任务
在服务器运行的爬虫,需要每个一段时间执行一次运行脚本
比如每分钟执行一次脚本
chenrui@ubuntu:~$ crontab -e
# m h dom mon dow command
*/1 * * * * sh /home/chenrui/test.sh
保存内容ctrl + o进入指令输入中,enter回车。
然后ctrl + x键退出。为了避免这种情况的出现,建议在crontab前使用export EDITOR=vim,让其使用vim编辑器。
war包shell启动脚本
#!/bin/bash
DIR="$( cd "$( dirname "$-1" )" && pwd )"
cd "${DIR}"
APP_NAME=app.war
if [ -e ${APP_NAME}_newbuild ]; then
if [ -e ${APP_NAME} ]; then
BACKUP_NAME="${APP_NAME}_"`date "+%Y%m%d_%H%M%S"`
echo "start backup to ${BACKUP_NAME}"
mv ./${APP_NAME} ${BACKUP_NAME}
fi
echo "start rename newbuild"
mv ./${APP_NAME}_newbuild ./${APP_NAME}
fi
ps -ef | grep ${DIR}/${APP_NAME} | awk '{print $2}' | xargs echo "kill old process "
ps -ef | grep ${DIR}/${APP_NAME} | awk '{print $2}' | xargs kill -9
echo "ready to start `expr \`date +%s%N\` / 1000000`"
sleep 5s
echo "执行后续启动脚本"
bash appStart.sh
shell脚本 for循环遍历内容并拼接成字符串
#!/bin/bash
for file in `ls ./Document`
do
x=$x,$file
done
echo $x
如果存在错误 email me: chenrui@marsdl.com