队列 bash 脚本
Queue bash script
假设我有一个 bash 脚本,我希望在给定时间最多有一个实例。假设多次调用同一个 bash 脚本的预期行为是将它们的执行排队。
在脚本类似于函数的单个程序中,这可以通过互斥锁来实现。
我将如何处理这样的设计?
好的,即兴发挥...
在脚本中实现排队系统。
让脚本尝试mkdir
一个已知的标准目录名称。
if mkdir /tmp/${0##*/}.Q
then : .. proceed normally
mkdir
是原子的,因此只有一个实例可以成功。
如果失败,请测试是否因为该目录已经存在。
如果没有,则有问题,报告并中止。
如果成功,则在以脚本的 PID 命名的目录中打开一个 FIFO,并在其中写入其命令行参数。也许添加 PID。
然后清除 args,fork a child 和 wait
。在 SIGCHLD 上再次读取 FIFO。只要找到东西,lather/rinse/repeat。没有了就关机
如果 运行s 带有 args 但目录存在然后确认副本已经 运行ning 在另一个 PID 上,找到目录中的 FIFO,写入 args(可能是 PID)到那个, 然后退出。
如果它没有 args(可能因为它是一个分支child),读取管道,设置args,并处理它们。确认有一个副本 运行 匹配 FIFO 的 PID。处理完所有记录后,删除FIFO,正常退出
根本没有测试过这个。期待发现一些瑕疵。
OR 只需查找“flagfile”并循环休眠直到它不存在,然后创建它,运行 通常,然后删除它完成后再次。这并不能保证 order,但它确实保留了 运行ning.
的不止一份副本
假设我有一个 bash 脚本,我希望在给定时间最多有一个实例。假设多次调用同一个 bash 脚本的预期行为是将它们的执行排队。
在脚本类似于函数的单个程序中,这可以通过互斥锁来实现。
我将如何处理这样的设计?
好的,即兴发挥...
在脚本中实现排队系统。
让脚本尝试mkdir
一个已知的标准目录名称。
if mkdir /tmp/${0##*/}.Q
then : .. proceed normally
mkdir
是原子的,因此只有一个实例可以成功。
如果失败,请测试是否因为该目录已经存在。
如果没有,则有问题,报告并中止。
如果成功,则在以脚本的 PID 命名的目录中打开一个 FIFO,并在其中写入其命令行参数。也许添加 PID。
然后清除 args,fork a child 和 wait
。在 SIGCHLD 上再次读取 FIFO。只要找到东西,lather/rinse/repeat。没有了就关机
如果 运行s 带有 args 但目录存在然后确认副本已经 运行ning 在另一个 PID 上,找到目录中的 FIFO,写入 args(可能是 PID)到那个, 然后退出。
如果它没有 args(可能因为它是一个分支child),读取管道,设置args,并处理它们。确认有一个副本 运行 匹配 FIFO 的 PID。处理完所有记录后,删除FIFO,正常退出
根本没有测试过这个。期待发现一些瑕疵。
OR 只需查找“flagfile”并循环休眠直到它不存在,然后创建它,运行 通常,然后删除它完成后再次。这并不能保证 order,但它确实保留了 运行ning.
的不止一份副本