shell脚本

编写shell脚本的参考例子:ClassicOldSong/shadow

一些特性

sh脚本可以直接放到/usr/local/bin等bin目录下去作为命令工具直接使用

$ vim /usr/local/bin/demo
#文件内容
#!/bin/bash
echo 123

$ chmod +x /usr/local/bin/demo #加权限

$ demo #执行命令
123

演示

linux一行命令中可以指定环境变量给要执行的命令,如

shell中对参数的处理

防止脚本同时运行多个 防止脚本多开

如何避免shell脚本被同时运行多次 转自:http://www.etwiki.cn/linux/2786.html

比如说有一个周期性(cron)备份mysql的脚本,或者rsync脚本,

如果出现意外,运行时间过长, 很有可能下一个备份周期已经开始了,当前周期的脚本却还没有运行完, 显然我们都不愿意看到这样的情况发生。

其实只要对脚本自身做一些改动,就可以避免它被重复运行。

当脚本开始运行时, 创建 /tmp/my.lock文件, 这时如果再次运行此脚本,发现存在my.lock,就退出, 脚本运行结束时删除这个文件。

大多数情况下,这样做都没有什么问题。 意外1) 如果同时运行二次此脚本, 二个进程都会发现my.lock不存在,然后都可以继续执行。 意外2) 如果脚本在运行过程中意外退出, 没有来得及删除 my.lock文件, 那么就悲剧了。

修改如下:

set -o noclobber 的意思:

If set, bash does not overwrite an existing file with the >, >&, and <> redirection operators.

这样就能保证my.lock只能被一个进程创建出来。比touch靠谱多了。

trap 可以捕获各种信号,然后做出处理: INT 用来处理 ctrl+c取消脚本执行的情况。 TERM 用来处理 kill -TERM pid 的情况。 EXIT 不清楚

另外,对于 kill -9 无效。。

还记得N年前,在php群里面,草人也问过这个问题, 我们给的答案是 ps aux|grep filename |wc -l ,哈哈,真2。

Last updated

Was this helpful?