Tag Archives: Unix

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

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

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

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

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

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

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

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

EOF

Unix 速成小法

先前说过 GNU 核心工具,类比了鸠摩智掌握了小无相功,就可以把 72 绝技耍得有模有样。这里的问题是,72 绝技秘笈在哪里 ? 如何去学 72 绝技呢?
林林总总的 Unix-like 操作系统文档都是可以找到的,如果把这些文档都看一遍恐怕是个大工程。我这里的建议是寻找差异化,推荐一篇很好的参考文档: Unixguide,建议打印下来,留在案头参考。多看几遍,起码对于不同 Unix 之间的差异有个大致的了解。不过可能没有人要同时面对这么多的操作系统要去搞, 有的时候可能只是从 Linux 转向 AIX,或是 Solaris 向 Linux 之间的转换,那么可以看一些迁移文档,比如 Solaris to Linux Migration: A Guide for System Administrators,都是完全可以在网上获取的。掌握差异化往往是节省学习成本的好方法,当然也是蒙人的好办法。
掌握差异化的过程中,或许可以进行一定程度上的总结,向回看,这些差异化有很多是因为 SysV 与 BSD 风格的不同带来的,颇有些武侠小说中佛家与道家武功对比的味道。站在一个更高的角度,比如 Unix 历史图,则令人又另有一番感触。
武侠小说中往往追求正统, 速成的东西大多被归结为邪门武功一类的,学习恐怕也是这样,决不能因为知道”一二三”如何写的就联想到”万”该划一万笔,走捷径或许只能解决一时问题,回头基础的东西还是要学,比如操作系统原理的课程。
未完, 等有机会继续扯…这个【扯淡系列】

继续阅读

Crontab 笔记

关于 Crontab ,维基百科上的词条 Crontab非常好。可惜这个地址在国内不用代理访问不到。 虽然关于 Crontab 的介绍到处都是,详细读了一遍这个词条,收获还是有的。Crontab 这个名字来自 “chronos”,一个古希腊语, “时间”的意思.

常见陷阱

每个SA、DBA 或者是普通的 Unix 用户,在第一次使用 Crontab 的时候都会遇到问题. 运行 Crontab 的常见错误包括如下几种:

1) 出于测试目的新创建了一条 Cron JOB,

时间间隔必须超过两分钟,否则 JOB 将调度不到。如果必须忽略这两分钟的载入配置时间差,可以通过重新启动 Cron Daemon 做到。

2) 从 Crontab 中启动 X Window 程序需要注意的事项:所以要么在程序前初始化 “DISPLAY=:0.0”, 要么在应用程序后面追加参数 –display :0.0 3) 命令中的 % 必须做转义处理: \% .我个人的意见是不要在命令行里带这个参数,干脆写到脚本里,然后调度该脚本即可。

其实我倒是认为使用 Crontab 最常见的一个问题往往是因为环境变量不对。经常会看到论坛里有人问:为什么我的 Crontab 创建了不执行? 准备创建一条 Cron JOB 的时候,很多人都喜欢在命令行下运行一遍,因为这个时候环境变量是随着 Shell 自动带进来,在 Crontab 中则可能因为找不到正确的环境变量,JOB 就不能执行。这个小问题就像出天花,一次教训之后就都记得了。

必须使用的一则技巧

每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。

附: Crontab 的格式说明如下: * 逗号(‘,’) 指定列表值。如: “1,3,4,7,8” * 中横线(‘-‘) 指定范围值 如 “1-6”, 代表 “1,2,3,4,5,6” * 星号 (‘‘) 代表所有可能的值 Linux(开源系统几乎都可以)下还有个 “/” 可以用. 在 Minute 字段上,/15 表示每 15 分钟执行一次. 而这个特性在商业 Unix ,比如 AIX 上就没有.

# Use the hash sign to prefix a comment
# +---------------- minute (0 - 59)
# |  +------------- hour (0 - 23)
# |  |  +---------- day of month (1 - 31)
# |  |  |  +------- month (1 - 12)
# |  |  |  |  +---- day of week (0 - 7) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *  command to be executed

系统级的 Crontab

查看 /etc/crontab 这个文件,可以或者更多系统级别的调度任务。通过这个文件也可以学习一下更好的 Crontab 是怎么定义的。需要留意如下四个目录的东西:

/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

在一个繁忙并且关键的系统上,有的时候这些默认的系统级任务调度会带来一些隐患。需要知晓。

用户添加的 Crontab 实际上存在什么位置呢? 这个实际上是存放在 /var/spool/cron/crontabs 目录下.

或许,你应该通过 man crontab 把整个手册读一遍。

GNU 核心工具

“说出 10 个 Linux 基本命令?”
这是当年我在毕业求职的时候遇到的一个面试题。没有难度。如果说法换一下,”说出 10 个 GNU 核心命令”,即使我能蒙出来 10 个,怕也会有错误。
GNU 核心工具(GNU Core Utilities)指的是 GNU 操作系统基本的文件、Shell、文本维护工具。

The GNU Core Utilities are the basic file, shell and text manipulation utilities of the GNU operating system. These are the core utilities which are expected to exist on every operating system.

GNU 核心工具 包括 fileutilsShellutilstextutils 三个部分。其中 fileutils 只有 22 个命令,有三个命令我居然从来没有用到过,分别是 mkfifo(Creates FIFOs)、shred(Destroy data in files)、vdir(Long directory listing)。Shellutils 有 35 条命令,其中也有我从来没有注意过的命令,比如 pinky(Lightweight finger);textutils 工具中也有用的极少的工具,而且用的时候也往往有一些坏习惯,textutils 有 26 条命令,注意 VI/VIM 并不在其中。
初学 Unix/GNU Linux 的时候往往觉得老虎吃天,无从下口。这里有个小小的建议:从这个 GNU 核心工具开始,逐步掌握包含的三类几十条命令。对于类 Unix 操作系统你就可以拿出去蒙人了,呵呵,象 Unix 操作系统速成? 这有点像《天龙八部》中鸠摩智学会了小无相功,就能把少林 72 绝技耍的像模像样有些类似。当然,仅靠这一点还不足以行走江湖,有时间咱再继续说。
EOF