那些天,shell脚本中曾经踩过的坑
2024-09-07 11:12:12
前些天,需要实现一个需求,用脚本轮流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 : else echo "date format is invalid!" exit ; fi |
常用的正则表达式
1
2
|
if [[ "$file" =~ 'start' ]] 或 if [[ "$file" =~ "start" ]] |
例子:
1
2
3
4
5
6
7
8
|
#!/usr/bin/ksh file = "10start11.s" if [[ "$file" =~ "start" ]] then echo "success" else echo "failed" fi |
只有bash才支持[[
ksh在test中应该不支持正则,用awk grep sed等工具实现吧
1
2
3
4
5
6
|
flag=` echo $ file | awk '/start/' ` if [ "$flag" = "" ]; then echo "success" else echo "failed" fi |
最新文章
- jquery-easyui 树的使用笔记
- Wordpress上传到阿里云服务器
- Windows 10 下安装 npm 后全局 node_modules 和 npm-cache 文件夹的设置
- 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
- mysql 设置编码 Incorrect string value: '\xE9\x98\xBF\xE4\xB8\x89...' for column 'cont,mysql乱码
- ALV详解:OO ALV
- samba 常见问题
- iOS开发系列--让你的应用“动”起来
- NDK编译FFMpeg[Linux]
- Tomcat 7.0配置SSL的问题及解决办法
- poj 2449 第k短路径
- xenserver 备份backup和还原restore命令
- Java学习笔记-Json
- unknown filesystem type ‘iso9660’类型问题--Ubuntu
- mysql show processlist详解
- 移动端300ms的点击延迟以及解决方案
- PHP秒杀系统全方位设计(二)
- 初试valgrind内存调试工具
- (翻译)W3C的Turtle文档
- [MySQL] timestamp和datetime的区别