我正在编写一个运行多个进程(连续)的多进程bash脚本,我需要启动一些函数,每个函数都有一个类似于man for flock中描述的形式:
function1 () {
#.... preamble, variable initialization
(
flock -x -w 10 200 || exit 1
# ... my commands ....
) 200>/var/lock/.`basename $0`$conf"-rtrr.lock"
}
每个函数都有自己的fd(数字)与其他函数不同,每个函数都独立于其他函数。
期望的行为是我应该能够并行运行多次相同的函数,唯一的条件是函数及其参数描述的只有一个实例可以在每个时刻运行。 如果函数执行失败,则父项运行在一个无限循环中并再次启动它,这不是问题。 例如,如果我们将此视为正在运行的进程/函数的列表:
OK
function1 a
function1 b
function2 a
function3 b
NO:
function1 a
function1 a
function2 b
function3 b
在每个部分,我使用类似的东西指定不同的锁定文件名:
/var/lock/${program_name}-${parameter}-${function_name}.lock
示例lockfile,如果使用:
调用function1/var/lock/program-a-function1.lock
问题:
答案 0 :(得分:0)
如果我是你,我会创建一个>
的锁文件,其名称将来自$0
(scriptname),${FUNCNAME[0]}
(函数名)和{{1} (函数参数的串联)并将它们与像flock联机帮助页中的9这样的小文件描述符一起使用。如果在脚本名$ 0上使用basename,请执行一次并将结果保存在全局中。
示例代码:
$*
示例代码的可能输出:
#!/bin/bash
script_name="$(basename "$0")"
func1()(
echo "$BASHPID: Locking $(readlink /dev/fd/9)"
flock 9 || return 1
echo "$BASHPID: Locked $(readlink /dev/fd/9)"
echo "$BASHPID: WORK"
sleep 1
echo "$BASHPID: Release $(readlink /dev/fd/9)"
) 9>/var/lock/"$script_name-${FUNCNAME[0]}-$*"
func1 a &
func1 a &
func1 a &
func1 b &
func1 b &
func1 b &
wait