Tag Archives: Shell

GNU Bash, version 4.0

GNU Bash(Bourne-Again SHell) 发布了 4.0 版本。新增加了不少特性。最近大半年基本上很少在终端里了,不过还是要关注一下。

新特性不完全列表
列出几个日常使用有关的:

  • 新的环境变量 $BASHPID 用以返回当前进程 PID。
  • 新的 ‘checkjobs’ 命令检查报告 Job 运行的情况。
  • 如因为缺少资源而创建子进程失败,bash 再尝试几次之后再报错(这个怎么觉得有点傻?)
  • ‘ulimit’ 内建新选项 -b (socket buffer size) 与 -T (number of threads)。
  • 新的 &>> 重定向操作符,追加标准输出与标准错误到指定文件中。

其他新功能多和 Bash 下的 Shell 编程有关,感兴趣的可以仔细看一下说明文件

此外,Readline 有了比较大的功能增强。大家用的最多的命令行历史,现在有了新的 history-size 变量用来设定。

EOF

如何确保 Shell 脚本只有一个实例运行

在做维护的时候,经常要写一些脚本定期检查一些状态信息,而比较糟的时候可能该脚本在执行周期内没完成,接着第二个脚本又开始跑了。如何确保 Shell 脚本只有一个实例运行就成了一个比较有意思的话题。

必需要承认,要做到 100% 的完美可能需要长篇大论才可以做到。如果对于粒度要求不高,这里总结两个粗糙的方法。

一个是在脚本执行的时候判断某个文件的存在,如果不存在,则 touch 创建该文件(该文件看作一个”占座”文件),脚本执行完毕的时候删掉。第二个进程如果启动,判断有该文件存在,则退出或者是 sleep 几秒钟重新判断。这个方法的关键是在删掉”占座”文件的处理方式上。必需要考虑到程序异常、被 Kill 等多个情况。根据需要 trap 搞一下。

trap 和 kill 命令的 -l 参数能够列出你想要的内容

第二个方法是过滤脚本的名字(当然最好把脚本起个独特一点容易过滤的名字),计数,如果存在一个或者多个 instance , 则退出或者 sleep 等待。否则执行脚本。这个方法最简单,但是移植性似乎要差一点,需要考虑不同平台或 Shell 上的表现。

这两个方法都太粗糙了,经不起考究,但是对于 99% 的系统可能都足够用了。反过来说,如果一个系统对于脚本运行的粒度要求非常高,需要考虑到操作的原子性,那么 Shell 或许并不适合完成这个任务。

解决问题就好,过分炫技不可取。

EOF

The parameter list is too long

非常常见的一个 Unix/Linux 命令错误信息: The parameter list is too long.

$ find /backup/* -ctime 2
ksh: /usr/bin/find: 0403-027 The parameter list is too long.

find: 0403-027 The parameter list is too long 这个错误信息很让人迷惑: 难道该目录下文件太多了么? 其实不是的, 问题出在那个 “*” 上,Korn Shell 默认把 * 作为 Metadata 处理,进行了扩展,进而这条语句备错误的解析.我的操作平台是 AIX 5.3. 我不确定这是和这个平台的 Korn Shell 有关.
使用 ls / grep / find 等命令时侯因为通配符的使用, 一不小心就会遇到这样的错误.可以通过对对象添加引号来禁止扩展

继续阅读