加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux Shell 编程实战技巧

发布时间:2016-01-16 23:13:14 所属栏目:Linux 来源:网络整理
导读:避免定时任务脚本的常见问题 很多脚本在实际使用的时候往往是以定时任务的方式运行,而非手工运行。但是实现同样功能的脚本在这两种运行方式下可能遇到的问题不

清单 4. 防止脚本重复运行方法 2

#!/usr/bin/ksh
    
main(){
selfPID="$$"
scriptFile="$0"
    
typeset existingPid
existingPid=`getExistingPIDs $selfPID "$scriptFile"`
    
if [ ! -z "$existingPid" ]; then
  echo "The script already running, killing it..."
  kill -9 "$existingPid" #此方法有一定风险,慎用!
fi
    
doItsTask
    
}
    
#获取除本身进程以外其它运行当前脚本的进程的 PID
getExistingPIDs(){
selfPID="$1"
scriptFile="$2"
ps -ef | grep "/usr/bin/ksh ${scriptFile}" | grep -v "grep" | awk "{ if($2!=$selfPID) print $2 }"
}
    
doItsTask(){
echo "Task is now being executed..."
sleep 20  #睡眠 20s,以模拟脚本在执行需要长时间完成的任务
}
    
main $*

脚本调试技巧

虽然 Shell 开发的一个普遍问题是调试困难,缺乏有效的调试工具。但是,我们可以采取一些能够一定程度上帮助我们规避调试困难的开发与调试的方式。 由于是脚本开发,不少人习惯于从直接地一行行地写代码,一个脚本里面甚至于一个函数都没有。虽然这种方式在语法上和功能上并无问题。但这增加了调试的难度。相反,如果采用模块化的方式去编写脚本,则使代码结构清晰、便于调试。这点,可以看这样一个例子。

假设下面的脚本的功能是收集生产环境中的相关日志文件,用于定位问题。需要收集的日志文件包括操作系统日志、中间件日志以及应用系统本身的日志。这些文件会被压缩成一个 gz 文件。
清单 5. 自动收集日志文件

#!/usr/bin/ksh
    
main(){
collectSyslog #收集系统日志文件
collectMiddlewareLog #收集中间件日志文件
collectAppLog #收集应用系统日志文件
tar -zcf logs.tgz syslog.zip mdwlog.zip applog.zip #将三中类型的日志打包,方便下载
}

若脚本执行报如下错误:

tar: applog.zip: Cannot stat: No such file or directory

我们可以很快锁定 collectAppLog 这个函数。因为它负责输出 applog.zip 这个文件。而没有必要看代码中的其它部分。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读