当陷阱到达我的系统时,我会自动执行 bash 脚本。问题是有时大量陷阱同时到达,导致大量执行脚本并生成系统 cpu 峰值 你知道如何避免这种情况吗?我想到了某种机制,只执行确定的脚本,其余的像 FIFO 队列一样等待,但我不知道这是否可能
谢谢
这是一种可能的解决方案,可以防止同时多次执行脚本。
首先,您将定义一个 fifo:
mkfifo /some/directory/fifo
然后,您将创建一个读取 fifo 的脚本:
#!/bin/bash
tail -f /some/directory/fifo | read line ; do
process "$line"
done
当陷阱到达时,执行以下脚本:
#!/bin/bash
echo "something from the trap" > /some/directory/fifo
在 fifo 上发布消息的脚本是轻量级的,因此产生的峰值比整个处理要少。现在处理已序列化,因此在给定时间仅运行一个处理脚本。您还可以
nice
进行处理,以减少影响。
回声应该足够原子,以防止大多数时候出现交错行。
另一种选择是使用锁来防止多个副本同时执行。看起来像:
#!/bin/bash
me=$$
echo $me>>lockfile
lockedby=$(head -1 lockfile)
while [ "$me" != "$lockedby" ] ; do
sleep 1
echo $me>>lockfile
lockedby=$(head -1 lockfile)
done
process the trap
rm -f lockfile