Shell-常见使用
脚本状态检测
潜在风险:编辑脚本也会被当作是程序运行中
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" # 显示脚本执行耗时
- 原文作者:zaza
- 原文链接:https://zazayaya.github.io/2021/08/11/shell-normal-use.html
- 说明:转载本站文章请标明出处,部分资源来源于网络,如有侵权请及时与我联系!