shellshell 脚本错误处理处理问题

调用Shell脚本无法正常退出的问题处理
做一些服务器部署的时候出现的一系列问题 使用sshpass执行脚本时,无法退出 使用php system,exec,之类的的shell调用函数无法退出的问题 当执行的脚本没有后台任务时,不会有任何问题 一旦出现无限循环的后台进程则会卡住不动 比如test1.sh的内容如下 #!/bi
做一些服务器部署的时候出现的一系列问题
使用sshpass执行脚本时,无法退出
使用php system,exec,之类的的shell调用函数无法退出的问题
当执行的脚本没有后台任务时,不会有任何问题
一旦出现无限循环的后台进程则会卡住不动
比如test1.sh的内容如下
#!/bin/bash
while true
echo &it's in loop&
test2.sh内容如果是
#!/bin/bash
test1.sh &
执行 ./test2.sh毫无问题,但是如果用 php的system执行,则会一直卡着(sshpass也是一样)
原因在于test1.sh的输出流被绑定到了执行进程,因此php跟sshpass之类的会认为程序没有结束
处理方法是 重定向输出流到文件或者/dev/null即可搞定
#!/bin/bash
test1.sh & /dev/null &
你最喜欢的xu3804897 的BLOG
用户名:xu3804897
访问量:300
注册日期:
阅读量:5863
阅读量:12276
阅读量:390343
阅读量:1081300
51CTO推荐博文
当我们再和脚本交互的时候 在终端上输错了内容& 使用退格键 屏幕上会出现乱码 比如 ^H&&& ^H不是H键的意思,是backspace
主要是当你的终端backspace有问题的时候才需要设置
解决方法有两种:
1、要使用回删键(backspace)时,同时按住ctrl键
2、设定环境变量
3、在脚本的开头可结尾 参数 stty erase ^H&&& stty erase ^?
2)在bash下:$ stty erase ^?
或者把 stty erase ^? 添加到.bash_profile中。
在csh下:$ stty erase ^H
或者把 stty erase ^H 添加到.cshrc中本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)Shell_Linux_Shell脚本库_日志处理中写的一些脚本 - 博客频道 - CSDN.NET
热爱技术的IT人
分类:Shell_Linux
最近博主被分配了一项紧急任务,事情有些紧急,花了两天的时间学习Shell,并完成了一项任务.自认为还算不错,
接下来分享下处理这个任务中所编写的一些脚本,就算留作纪念吧
用到的技术点
0.常用的 Linux命令 &cat / grep / sed / cd / wc &
1.shell 流程控制&
2.shell 条件判断
3.shell 变量
5.shell 数组&
6.正则匹配
将两个文件下的指定文件合并放置到一个新的文件夹下面
dir1=&/data/logs/d19_/selectedlogs/82/baselogs/newlogs_tmp/newlogs/&
dir2=&/data/logs/d19__advanced/&
for((i=1;i&=24;i++));do
if((i&10));then
date=&0$i&
#echo $date
cat ${dir1}._201607${date}_82_new.log ${dir2}201607${date}.log
&& /data/logs/sm_new/82_new/201607${date}_82.log
重命名符合条件的文件(批处理)
while(($in&))
filename=&._&&$in&&.log&
outname=&._&&$in&&_.log&
mv $outname $filename
let &in++&
利用sed与正则替换符合条件的串
logFile=&copy_05_06.log&
sed -i &s/[0-9]\{2\}\/\(May\|Jun\|Jul\)/$date\/Jul/g& $logFile
grep -v &$date/Jul& $logFile
#检验有没有删除干净
利用grep -v 检查日志文件是否有不满足规则的行
dir=&/data/logs/d19_/ selectedlogs/82/baselogs/newlogs/&
date_count=25
sitelist=(82)
echo ${sitelist[0]}
cd &${dir}& #进入制定路径
for((i=1; i&25; i++));do
if((i&10));then
date=&0$i&
echo $date
grep -v &${date}/Jul& *201607${date}_82_new.log && error.log
========一些不太常用到的脚本=================
==============================================
从日志文件中随机选取几条记录写入到另一个文件中
file=&copy_05_06.log&
outfile=&Jul_&&$date.log&
declare lines=0;
#日志文件中剩余的日志条数
function totalLines(){
result=&`wc -l $file`&
#如果想从命令中获取数据的话,也可以用 $()
arr=($result)
#将结果转换为数组
lines=${arr[0]}
#获取第0个参数,行号
#echo $lines
#打印总的行数
sum=$(($RANDOM%8+8)) #sum记录了随机选取的条数
echo &lines has been selected Num:$sum&
echo &before delete: $(wc -l $file)&
for((i=0;i&$i++));do
#echo ${lines}
randomline=$(($RANDOM%$lines))
sed -n &${randomline}p& &$file&
&& $outfile
#随机取一条数据追加到outfile
sed -i &${randomline}d& &$file&
#删除被取出取的那一行
#echo $randomline
echo &after delete: $(wc -l $file)&
echo &selected lines: $(wc -l $outfile)&
1、合并 cat file1 file2 & file3
2、去重 sort file3 | uniq && file4
3、随机抽取 shuf -n12 file4 & file5
查行数wc -l
4、去掉a中包含b的部分
cat b.txt a.txt | sort| uniq -u &
随机删除日志文件中的数据(批处理方式)
#! /bin/bash
rate=$((RANDOM%7+85))
indir=&/mnt/hgfs/Share_Windows_Linux/&
outdir=&/mnt/hgfs/Share_Windows_Linux/&
indate=(18 17 16 18 28 17 16 30 27 19)
outdate=(01 02 03 04 05 06 07 08 09 10)
cd &$indir&
for((i=0;i&10;i++));do
cat ._201606${indate[i]}_selected.log |
while read LINE
num=$(($RANDOM%100))
#echo ${num}
if((${num} &= ${rate}));then
#echo ${num}
echo $LINE && ${outdir}._201607${outdate[i]}_new.log
awk修改cid,对原有的cid进行随机+n操作
#!/bin/bash
sour=&data.txt&
out=&data_new.txt&
ct=$(wc -l $sour | awk '{print $1}')
echo &source file lines : $ct&
lines=$(( ($RANDOM%10+90)*ct/100 ))
echo &should be change lines : $lines&
awk -v num=$lines
-F'&' '
if(NR&=num)
split($2,a,&=&);
ct=int(rand()*100%9);
a[2]=a[2]+
gsub(/cid=[0-9]*/,&cid=&a[2],$0);
#$2=a[1]&=&a[2];
' $sour & $out
old=$(wc -l $sour | awk '{print $1}')
new=$(wc -l $out | awk '{print $1}')
echo &old file has $old lines&
echo &new file has $new lines&
排名:第3731名
(0)(1)(17)(1)(0)(11)(5)(0)(15)(24)(13)(20)(3)(8)(6)(0)(8)(28)(12)(10)(12)(0)(5)(0)(2)(23)(0)(54)(32)(83)(12)(15)(19)(7)(5)(1)(33)(31)(0)(2)(41)(3)(1)(0)(3)(10)(3)(0)(2)(3)(17)(16)(0)(0)(0)(9)(29)(8)(0)(1)(1)(1)(2)(1)(2)(1)(7)(2)(1)(1)(1)(1)(2)(3)(0)(13)(3)(11)(1)(1)hiubuntu 的BLOG
用户名:hiubuntu
文章数:105
评论数:17
访问量:49570
注册日期:
阅读量:5863
阅读量:12276
阅读量:390343
阅读量:1081300
51CTO推荐博文
& & 某个脚本手工运行可以产生正确输出,而放在定时任务crontab中却有问题。解决思路:& & 1、一般的crontab都会生产mail邮件(如果没有在crotab里面删掉末尾的"&&/dev/null"),使用mail命令看看crontab产生的消息,定位一下具体出了什么问题,我看到的报错就是:Message&49:
From&root@lvs2.localdomain&&Tue&Sep&23&19:56:02&2014
Return-Path:&&root@lvs2.localdomain&
X-Original-To:&root
Delivered-To:&root@lvs2.localdomain
From:&root@lvs2.localdomain&(Cron&Daemon)
To:&root@lvs2.localdomain
Subject:&Cron&&root@lvs2&&/bin/bash&/root/collect_log.sh
Content-Type:&text/&charset=UTF-8
Auto-Submitted:&auto-generated
X-Cron-Env:&&SHELL=/bin/sh&
X-Cron-Env:&&HOME=/root&
X-Cron-Env:&&PATH=/usr/bin:/bin&
X-Cron-Env:&&LOGNAME=root&
X-Cron-Env:&&USER=root&
Date:&Tue,&23&Sep&:02&-0700&(PDT)
Status:&RO
/root/collect_log.sh:&line&20:&ifconfig:&command&not&found
/root/collect_log.sh:&line&20:&ifconfig:&command&not&found
/root/collect_log.sh:&line&20:&ifconfig:&command&not&found
/root/collect_log.sh:&line&20:&ifconfig:&command&not&found
/root/collect_log.sh:&line&20:&ifconfig:&command&not&found& & 2、由此很清晰看到是ifconfig没有正确执行,很明显系统不可能没有这个命令,应该是没找到正确路径的问题,这是因为crontab执行时调用的是/etc/crontab文件中的配置,查看一下:[root@lvs2&~]#&cat&/etc/crontab&
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
#&For&details&see&man&4&crontabs
#&Example&of&job&definition:
#&.----------------&minute&(0&-&59)
#&|&&.-------------&hour&(0&-&23)
#&|&&|&&.----------&day&of&month&(1&-&31)
#&|&&|&&|&&.-------&month&(1&-&12)&OR&jan,feb,mar,apr&...
#&|&&|&&|&&|&&.----&day&of&week&(0&-&6)&(Sunday=0&or&7)&OR&sun,mon,tue,wed,thu,fri,sat
#&|&&|&&|&&|&&|
#&*&&*&&*&&*&&*&user-name&command&to&be&executed
*&*&*&*&*&ls
*&*&*&*&*&ls&-e&-。。。好吧,PATH是对的,貌似这个配置有点坑爹,但是不管怎样,对照了当前home目录下.bashrc的内容,发现是直接调用的/etc/下的profile和bashrc,先在脚本中加上:source&/etc/profile
source&/etc/bashrc如果还有其他特定配置文件也都加载下。这下计划任务执行就OK了。& & 3、其他的一些错误大多是crontab编写格式错误,或者是脚本权限不对,好好检查下就没啥事了,为了平台的通用性,最好还是多写绝对路径,少用相对路径。最后记得在crontab的任务末尾加上&&/dev/null 2&1&,避免太多输出占满空间。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 shell脚本 的文章

 

随机推荐