我需要阻止同时调用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秒。
答案 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
命令。其余的将等待另一个脚本完成(因此描述符将被关闭并且锁被释放)。在此之后,下一个脚本将获取锁定并执行,依此类推。