可以使用什么Unix命令作为信号量/锁?

我打算并行运行大量的Bash shell手稿。 尽管如此,我打算远离种族问题。 Unix命令是什么 绝对 我可以利用这个目标的原子,以及我如何利用它们?

0
2019-05-04 23:21:27
资源 分享
答案: 5

系统调用mkdir()在POSIX文件系统上是原子的。 因此,使用mkdir命令就好像它需要专门拨打一次mkdir()电话肯定会达到你的目标。 (IOW,不要使用mkdir -p)。 当然,等效解锁是rmdir

警告:mkdir()在网络文件系统上不可能是原子的。

0
2019-05-08 23:21:20
资源

flock(1)

#!/bin/bash

# Makes sure we exit if flock fails.
set -e

(
  # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
  flock -x -w 10 200

  # Do stuff

) 200>/var/lock/.myscript.exclusivelock

这使得“(”和“)”之间的代码只能由一个程序同时运行,程序也会等待一个锁也很长。

0
2019-05-08 11:46:04
资源

如果你的系统上没有安装lockfile,那么mkdir肯定会完成这项工作:它是一个原子程序,如果目录站点当前存在,它也会失败(只要你不添加-p命令行按钮)。

create_lock_or_wait () {
  path="$1"
  wait_time="${2:-10}"
  while true; do
        if mkdir "${path}.lock.d"; then
           break;
        fi
        sleep $wait_time
  done
}

remove_lock () {
  path="$1"
  rmdir "${path}.lock.d"
}
0
2019-05-08 10:38:42
资源

lockfile(1)类似于一个很好的前景,但要注意它是procmail的计划的组成部分,你可能还没有实际安装在你的设备上。 这是一个首选的适当计划,如果它尚未安装,它需要为您的系统打包。 我检查过的4个系统中有3个有它,还有其他各种系统随时可用。

使用它很简单:

#!/bin/sh
LOCKFILE=$HOME/.myscript/lock
mkdir -p `dirname $LOCKFILE`

echo Waiting for lock $LOCKFILE...
if lockfile -1 -r15 $LOCKFILE
then
    # Do protected stuff here
    echo Doing protected stuff...

    # Then, afterward, clean up so another instance of this script can run
    rm -f $LOCKFILE
else
    echo "Failed to acquire lock!  lockfile(1) returned $?"
    exit 1
fi

我提供的替代方案使其在第二次重试大约15秒后重试。 如果你希望它等待生命,请按下“-r”标志。

0
2019-05-08 08:53:50
资源

也许lockfile命令肯定会满足您的要求。

lockfile ~/.config/mylockfile.lock
.....
rm -f important.lock
0
2019-05-08 06:09:53
资源