避免同一脚本的两个实例同时运行的典型方法如下:
[ -f ".lock" ] && exit 1
touch .lock
# do something
rm .lock
有没有更好的方法来锁定shell脚本中的文件,从而避免出现竞争状况?必须使用目录代替吗?
是的,示例脚本中确实存在竞争条件。您可以使用bash的noclobber
选项,以便在比赛-f
和其他测试脚本潜行时出现比赛失败touch
。
以下是一个示例代码片段(受本文启发),说明了该机制:
if (set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
# This will cause the lock-file to be deleted in case of a
# premature exit.
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
# Critical Section: Here you'd place the code/commands you want
# to be protected (i.e., not run in multiple processes at once).
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Failed to acquire lock-file: $lockfile."
echo "Held by process $(cat $lockfile)."
fi
问题内容: 我正在开发的应用程序中存在潜在的竞争状况,我想在查询中考虑和避免这种情况。 总结应用程序流程… 在表中创建一个新行: 通过查看对时间敏感的表格,找出Bar先生是否是获胜者: 如果他是赢家,请相应地更新他的条目行: 由于每个奖项只能颁发一次,因此我需要消除比赛条件的任何可能性,在这种情况下,另一个过程可以查询奖项表并更新上述步骤2和3之间的条目表。 我一直在做一些研究,发现了大量关于事务
问题内容: 我正在执行超过1.5 TB数据的Hadoop作业,并进行了大量模式匹配。我有几台机器,每台机器都有16GB的RAM,我总是用这些数据来完成这项工作(我正在使用Hive)。 我想知道如何在文件中优化设置选项,所以我的工作不会失败。甚至可以设置此选项以使我的工作不会失败吗? 当我设置为1.5 GB并从查询中删除了一半的模式匹配时,作业成功运行。那么,如果该选项不能帮助避免作业失败,那么该选
我有一个分布式任务队列,其中的任务如下所示: 这里有一个竞争条件:如果任务队列软件在完全相同的时间启动其中两个任务,它们都将从数据库中获得相同的<code>old_path</code>,并且竞争失败者的取消链接调用失败(将失败者的新路径从未来的取消链接中孤立出来)。 有没有办法让我构建它来绕过这场比赛?如果需要,我可以从当前设计中抛出几乎任何东西。具体来说,我使用的是PostgreSQL,Pyt
问题内容: 在确定文件是否存在时,使用try语句如何避免“竞争条件”? 我之所以这样问是因为高度支持的答案0)(更新:已删除)似乎暗示使用会创造机会,否则这种机会就不会存在。 给出的示例是: 但与以下内容相比,我不了解如何避免出现竞争状况: 调用如何使攻击者能够处理他们无法完成的文件? 问题答案: 比赛条件,当然,你的程序和文件上运行一些其他的代码之间(竞争状态总是需要至少两个平行的进程或线程,看
我有一个war文件,其中包含许多AsheJ方面和一个aop.xml文件,其中指定了这些方面适用的包。我通过将这一行添加到我的Spring配置中来启用aop加载时间编织Spring: 这将启动我的应用程序服务器的默认weaver:org。springframework。仪器类加载。weblogic。WebLogicLoadTimeWeaver。 问题是,我们还有另一个方面 正如我所见,这两个织工似乎
主要内容:示例资源分配图是系统状态的图形表示。 顾名思义,资源分配图是关于持有一些资源或等待某些资源的所有进程的完整信息。 它还包含有关所有资源的所有实例的信息,无论这些资源是否可用或正在被进程使用。 在资源分配图中,进程由圆形表示,而资源由矩形表示。 我们来详细看看顶点和边的类型。 顶点主要有两种类型,资源和过程。 它们中的每一个将以不同的形状表示。 Circle代表进程,而矩形代表资源。 一个资源可以有多个