那些天,shell脚本中曾经踩过的坑
前些天,需要实现一个需求,用脚本轮流kill服务器上的进程,观察内存变化情况,并写日志。脚本逻辑不难,但shell脚本好久不用,看过书里的语法都忘得差不多了,中间踩了不少的坑,特此记录一下,留作后续参考。
脚本使用了两个函数,第一个是去查询内存变化,并不断写日志。用了一个loop变量来记录次数,然后就是用echo和>>符号不断写进日志文件,要注意的是shell脚本中用··(键盘1旁边的那个符号,不是单引号)包含linux命令,用$符号对变量做引用。如果函数需要传参,则在函数体内,用$1表示第一个参数,$2表示第二个参数,以此类推。部分代码如下:
function MemoryQuery()
{
loop=6
interval=30
while true
do
echo "The $loop time to kill $1,and record the memory" >> $LOG_FILE
echo `date`>>$LOG_FILE
echo `free` >> $LOG_FILE
echo "***mem info***">> $LOG_FILE
cat /proc/meminfo >>$LOG_FILE
loop=`expr $loop -1`
if [ $loop -eq 0 ] ;then
break
fi
sleep $interval
done
}
该函数的调用方法为MemoryQuery signal
第二个函数是去不断kill各种进程,进程名称为传入参数,并在第二个函数中,完成进程杀除后,去调用前一个内存查询函数。函数代码如下:
function KillProcess()
{
check_result=`ps -ef|grep $1 |grep -v "grep"`
echo "check $1 result is :"$check_result
if [[ $check_result=~"/$1" ]]
then
killall -9 $1
echo "matched and killed"
check_result=`ps -ef|grep $1 |grep -v "grep"`
echo "check $1 result is :"$check_result
echo "start to query memory"
MemoryQuery $1
else
echo "no" $1 "exist!"
fi
}
这里在查询进程是否存在时,可以在用一次grep -v "grep"把grep的输出过滤掉,这个是新学到的。另外在if语句中使用正则表达式来判断输出是否符合预期,是使用“=~”符号。关于正则表达式,网上百度找到的资料如下:
由于工作需要对用户提交的数据进行验证,这是一个简单的日期正则验证实例,有需要了解的同学可参考。
shell中的if语句需要做一个正则判断,查了一下语法记录之。
|
1
2
3
4
5
6
|
DATEPATTERN="^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$"if [[ "$STARTDATE" =~ $DATEPATTERN ]] && [[ $ENDDATE =~ $DATEPATTERN ]]; then :elseecho "date format is invalid!"exit;fi |
常用的正则表达式
|
1
2
|
if [[ "$file" =~ 'start' ]]或if [[ "$file" =~ "start" ]] |
例子:
|
1
2
3
4
5
6
7
8
|
#!/usr/bin/kshfile="10start11.s"if [[ "$file" =~ "start" ]]thenecho "success"elseecho "failed"fi |
只有bash才支持[[
ksh在test中应该不支持正则,用awk grep sed等工具实现吧
|
1
2
3
4
5
6
|
flag=`echo $file |awk '/start/'`if [ "$flag" = "" ];thenecho "success"elseecho "failed"fi |
那些天,shell脚本中曾经踩过的坑的更多相关文章
- 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器
本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...
- shell脚本中的反引号使用 `
反引号是~的英文切换 在shell脚本中,反引号允许将shell命令的输出赋值给变量. test=`date` 这样shell会执行反引号中的命令.并将执行的结果赋值给变量tests.
- Shell脚本中执行mysql的几种方式(转)
Shell脚本中执行mysql的几种方式(转) 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用 ...
- Shell脚本中执行sql语句操作mysql
对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...
- Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载
Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...
- 【转】shell脚本中echo显示内容带颜色
shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e.格式如下: echo -e "\033[41;36m something here \033[0m&qu ...
- 在shell脚本中使用函数
转载请标明:http://www.cnblogs.com/winifred-tang94/ 对于在脚本中重复使用的功能模块,可以封装成为函数. shell脚本中函数的定义可以使用如下两种方式: a. ...
- 在shell脚本中进行条件控制以及使用循环
转载请标明:http://www.cnblogs.com/winifred-tang94/ if条件语句语法: if [ 条件表达式 ] then 代码 else 代码 fi 注意:在上面的if条件语 ...
- Linux/Unix shell 脚本中调用SQL,RMAN脚本
Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可 ...
随机推荐
- (十四)struts2的国际化
一.国际化的概念 国际化是指web程序在运行时,根据客户端请求的国家.语言的不同而显示不同的界面. 例如,如果请求来自中文客户端,则页面的显示,提示信息等都是中文,如果是英文客户端,则显示英文信息. ...
- 神奇的魔方阵--(MagicSquare)(2)
在上一篇博客中,我们讨论了阶数为奇数,以及阶数为(4K)的魔方阵的排列规则,以及代码实现(详见:https://www.cnblogs.com/1651472192-wz/p/14640903.htm ...
- 由一名保安引发的Java设计模式:外观模式
目录 应用场景 外观模式 定义 意图 主要解决问题 何时使用 优缺点 结构 保安的故事 应用场景 使用方要完成一个功能,需要调用提供方的多个接口.方法,调用过程复杂时,我们可以再提供一个高层接口(新的 ...
- Day11_55_在Map集合中使用泛型
在Map集合中使用泛型 ``` import java.util.HashMap; import java.util.Iterator; import java.util.Map; import ja ...
- 2021 年最值得推荐的 7 个 Angular 前端组件库 - DevUI
摘要:DevUI 是一款面向企业中后台产品的开源前端解决方案,它倡导沉浸.灵活.至简的设计价值观,提倡设计者为真实的需求服务,为多数人的设计,拒绝哗众取宠.取悦眼球的设计.如果你正在开发 ToB 的工 ...
- hdfs文件系统挂载
简要说明: 使用fuse将hdfs文件系统挂载远程服务器上,像使用nfs和glusterfs那样可以挂载共享存储 fuse安装 fuse可以编译安装或者通过CDH或ambari源yum安装 此处使用a ...
- 深入了解Zookeeper核心原理
之前的文章Zookeeper基础原理&应用场景详解中将Zookeeper的基本原理及其应用场景做了一个详细的介绍,虽然介绍了其底层的存储原理.如何使用Zookeeper来实现分布式锁.但是我认 ...
- WordPress伪静态规则设置
伪静态:即网站本身是动态网页如.php..asp..aspx等格式,而这类网页还带"?"加参数来读取数据库.开启伪静态后,动态网页即被转换重写成静态网页类型页面. WordPres ...
- 【vim】复制粘贴相关操作
复制: 首先,可以在命令模式下输入v进入自由选取模式,选择需要剪切的文字后,按下d就可以进行剪切了. 其他命令模式下剪切命令: yy:复制当前行 nyy:n表示大于1的数字,复制n行 yw:从光标处复 ...
- LA3971组装电脑
题意: 你有b块钱,想要组装一台电脑,给你提供一些零件,每种零件提供一个或几个,组装电脑的前提是每种零件只能也必须选择一个,每种零件都有自己的种类,名字,价格,还有品质,要求是在能配成电脑 ...