队列bash脚本

队列bash脚本,bash,concurrency,thread-safety,script,Bash,Concurrency,Thread Safety,Script,假设我有一个bash脚本,在给定的时间内最多需要一个实例。假设对同一bash脚本的多个调用的预期行为是对它们的执行进行排队 在脚本类似于函数的单个程序中,这可以通过互斥锁实现 我该如何处理这样的设计呢?好的,即兴制作 在脚本中实现一个排队系统 让脚本尝试mkdir一个已知的标准目录名 if mkdir /tmp/${0##*/}.Q then : .. proceed normally mkdir是原子的,因此只有一个实例可以成功。 如果失败,测试是否是因为目录已经存在。 如果没有,则表示出现

假设我有一个bash脚本,在给定的时间内最多需要一个实例。假设对同一bash脚本的多个调用的预期行为是对它们的执行进行排队

在脚本类似于函数的单个程序中,这可以通过互斥锁实现


我该如何处理这样的设计呢?

好的,即兴制作

在脚本中实现一个排队系统

让脚本尝试
mkdir
一个已知的标准目录名

if mkdir /tmp/${0##*/}.Q
then : .. proceed normally
mkdir
是原子的,因此只有一个实例可以成功。
如果失败,测试是否是因为目录已经存在。
如果没有,则表示出现问题,报告并中止。
如果成功,请在该目录中以脚本的PID命名打开FIFO,并将其命令行参数写入其中。可能会添加PID。
然后清除args,叉出一个子对象,然后等待。在SIGCHLD上,再次读取FIFO。只要你找到了东西,就用泡沫/冲洗/重复。当没有了,就关机

如果使用args运行,但dir存在,则确认副本已在另一个PID上运行,在dir中找到FIFO,将args(&可能是PID)写入其中,然后退出

如果它没有参数(可能是因为它是一个分叉的子对象),则读取管道,设置参数,然后处理它们。确认有一个与FIFO匹配的PID运行的副本。删除FIFO并在处理所有记录时正常退出

根本没有测试过这个。希望能发现一些缺陷


或者只是查找“flagfile”并在循环中休眠一点,直到它不存在,然后创建它,正常运行,完成后再次删除它。这并不能保证顺序,但它确实阻止了多个副本的运行。

看看啊,我不知道mkdir是原子的。想喝点什么吗!mkdir{}然后运行脚本作为互斥锁模拟器工作(排序不重要)?触摸会更好吗?你可能想使用
flock
,但是
直到mkdir foo;do
应该可以正常工作。