我发现这个解决方案在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中可以实现同样的目标吗?如果是这样,有人可以发布一个有效的例子吗?
非常感谢
答案 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
,这意味着失败而不是等待。因此,使用此选项,您可以决定输出错误消息而不是等待。
答案 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