延迟不阻止bash函数同时执行

时间:2017-06-08 08:39:05

标签: linux bash

我需要阻止同时调用highCpuFunction函数。我试图创建一个阻止机制,但它不起作用。有人可以帮我弄这个吗?

nameOftheScript="$(basename $0)"
pidOftheScript="$$"

highCpuFunction()
{
# Function with code causing high CPU usage.Like tar,zip etc.


while [  -f /tmp/"$nameOftheScript"*  ];
 do 
    sleep 5;
done
touch /tmp/"$nameOftheScript"_"$pidOftheScript"

echo "$(date +%s) I am a Bad function you do not want to call me simultaniously..."
#real high CPU usage code for reaching DB and parsing logs.Take heck of CPU. 

rm -rf /tmp/"$nameOftheScript"_"$pidOftheScript" 2>/dev/null

}

while true
do
   sleep 2
    highCpuFunction
done
#Rest of code........

简而言之,我希望至少以5秒的间隔运行highCpuFunction。无论实例/用户/终端如何。我需要允许其他用户以正确的顺序运行此功能,并且间隔至少为5秒。

2 个答案:

答案 0 :(得分:2)

在以下解决方案中# rest of the script部分只能由一个进程执行。测试和设置是原子的,没有竞争条件,而test -f file .. touch file,两个进程可以触摸文件。

try_acquire_lock() {
    local lock_file=$1
    # noclobber option to fail if file already exist
    # in a sub-shell to avoid modifying current shell options
    ( set -o noclobber; : >"$lock_file")
}

# trap to remove the file when process exits
trap 'rm "$lock_file"' EXIT

lock_file=/tmp/"$nameOftheScript"_"$pidOftheScript"
while ! try_acquire_lock "$lock_file";
do 
    echo "failed to acquire lock, sleeping 5sec.."
    sleep 5;
done

# rest of the script

它不是最佳的,因为等待是在一个有睡眠的循环中完成的。 为了改进,可以使用进程间通信(fifo),或操作系统通知或信号。

# block current shell process
kill -STOP $BASHPID

# unblock blocked shell process (where <pid> is the id of blocked process)
kill -CONT <pid>

答案 1 :(得分:2)

使用flock工具。考虑一下这段代码(让我们称之为'onlyoneofme.sh&#39;)

#!/bin/sh

exec 9>/var/lock/myexclusivelock

flock 9
echo start
sleep 10
echo stop

它会将文件/ var / lock / myexclusivelock打开为描述符9,然后尝试将其锁定。只允许一个脚本实例传递flock 9命令。其余的将等待另一个脚本完成(因此描述符将被关闭并且锁被释放)。在此之后,下一个脚本将获取锁定并执行,依此类推。