Linux shell脚本单进程执行

在CI中,为了实现shell脚本的单例执行,文章探讨了两种方案。第一种通过检查pid文件数量,但存在等待堆积的问题;第二种方案利用flock进行文件锁定,确保脚本在已运行状态下不会重复执行,且在程序结束时自动释放锁。
摘要由CSDN通过智能技术生成

简要

在持续集成(CI)中, 我们的项目使用的是 shell, 某个stages是需要单例执行(因为要独占进程). 因此想到了要使用单例. 等待执行.

第一种方案

代码

#!/bin/bash
file_name=`basename $0`
echo $file_name
while [ `pgrep -f ${
    file_name} | wc -l` -gt 2 ]; do
        echo ${file_name} process existed, sleep 5s
        sleep 5
done

echo 开始执行
sleep 8
echo 执行结束

解释

bashename $0 只取文件名
例如 bash ~/demo/test.sh $0=~/demo/test.sh bashename $0=test.sh

pgrep -f ${file_name}输出含有file_name的pid
wc -l 计数
理论上 大于1即可, 但是为什么要大于2呢, 本身占一个进程(bash ./test.sh), 内部又有执行外部命令pgrep -f ${file_name} | wc -l 占一个进程, 共两个进程, 如果在执行一次bash ./test.sh必定大于2了.

该方法理论上看上去没什么问题, 但是当堆积起来时(比如堆积3个时), 必定都陷入了等待. 两个是没有问题的看图.
稍微改了下代码, 便于查看 count数

#!/bin/bash
file_name=`basename $0`
echo $file_name
count=`pgrep -f ${
    file_name} | wc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值