使用套接字的bash锁定机制

时间:2014-10-13 10:10:31

标签: python linux bash locking

我发现这个解决方案在python中执行进程锁定机制:

import socket
import sys
import time

def get_lock(process_name):
    global lock_socket
    lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
    try:
        lock_socket.bind('\0' + process_name)
        print 'I got the lock'
    except socket.error:
        print 'lock exists'
        sys.exit()

get_lock('running_test')
while True:
    time.sleep(3)

这是在这里找到的: Check to see if python script is running

在bash中可以实现同样的目标吗?如果是这样,有人可以发布一个有效的例子吗?

非常感谢

2 个答案:

答案 0 :(得分:2)

虽然我编写了一个编辑文件的bash脚本,同时此脚本的多个流程实例需要同时运行,这会导致一些竞争条件,这可能会弄乱我的文件。我找到了一个互斥锁解决方案来解决我的问题:

    # Add mutual exclusive lock in case there's race condition.
    {
        flock 201
        echo 'replace this echo with actions for your case' >> /tmp/file_to_edit
    } 201> /tmp/file_used_as_lock 

请注意flock有一个选项-n,这意味着失败而不是等待。因此,使用此选项,您可以决定输出错误消息而不是等待。

请参阅此http://mywiki.wooledge.org/BashFAQ/045

答案 1 :(得分:0)

我使用了以下代码片段来避免多个并发调用bash脚本

#!/usr/bin/env bash
ScriptName=${0##*/}
FlockFile="/tmp/${ScriptName}.lck"
touch ${FlockFile} 2>/dev/null
[[ $? -ne 0 ]] && echo "Cannot access lock file ${FlockFile}" && exit 2
exec 5>${FlockFile}
flock -nx 5
[[ $? -ne 0 ]] && echo "Another instance of ${ScriptName} is running" && exit 1
chmod 666 ${FlockFile} 2>/dev/null
# Main script here