脚本状态检测

潜在风险:编辑脚本也会被当作是程序运行中

pid文件+进程状态规避

问题:crontab下无法使用

shell_name=`basename $0`
# 基于"脚本"规避
pgrep -fl ${shell_name} > /dev/null && echo "程序运行中" && exit
# 基于"脚本+参数"规避
pgrep -fl "${shell_name} rsync_log" | grep -v $$ && echo "程序运行中" && exit
pgrep -fl "${shell_name} cut_log" | grep -v $$ && echo "程序运行中" && exit

crontab锁定任务

-s, --shared:    获得一个共享锁
-x, --exclusive: 获得一个独占锁
-u, --unlock:    移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁
-n, --nonblock:  如果没有立即获得锁,直接失败而不是等待
-w, --timeout:   如果没有立即获得锁,等待指定时间
-o, --close:     在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-c, --command:   在<a href="http://www.ttlsa.com/shell/" title="shell"target="_blank">shell</a>中运行一个单独的命令
-h, --help       显示帮助
-V, --version:   显示版本

# 命令没有执行完成,下一个crontab会自动退出
* * * * * flock -xn /tmp/mytest.lock -c "sleep 10 && echo 1"

shell循环赋值

skip_date=""
sep=""
for i in `seq 0 6`
do
	skip_date="${skip_date}${sep}$(date -d "-$i days" +%F)"
	sep="|"
done
echo $skip_date

shell并发模型

#!/bin/bash
# 队列并发模型
NQ=3
num=5
for ((i=0; i<$NQ; i++)); do
    for ((j=0; j<$num; j++)); do
       echo  "progress $i is sleeping for 3 seconds zzz…"
       sleep 3 &
    done
    wait
done
# 等待循环结束再执行wait后面的内容
echo -e "time-consuming: $SECONDS    seconds"    # 显示脚本执行耗时