简要
在持续集成(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