Ubuntu中的信号量和锁定

时间:2010-11-30 18:12:42

标签: ubuntu semaphore

我有一个备份服务器,每小时收到许多rsync个连接。由于具有太多开放rsync实例可能会使其崩溃,因此我想使用Semaphore来限制并发实例的数量。我想到的是:

ssh root@backup_server "get_semaphore"     #Will hold until semaphore released
rsync -avzrL --super --delete local_directory root@backup_server:`localhost`

有什么想法吗?

1 个答案:

答案 0 :(得分:12)

在我看来,您应该考虑直接在服务器端限制并发连接的数量,这样您就不必在客户端做任何极端的事情了:

(1)如果在守护进程模式下运行rsync,则rsyncd.conf有max connections选项。

(2)在Linux上,您可以使用iptables及其connlimit模块来limit从一个或多个远程主机到端口的并发连接数。您可能必须强制任何rsync客户端使用与普通ssh用户不同的端口,并让sshd实例也听取它。

(3)使用包装器脚本替换服务器上的rsync二进制文件,该脚本将捕获rsync内部使用的--server参数并停止,直到插槽可用。所述包装器脚本应该确保同时执行的N个实例不超过N个。 E.g。

#!/bin/bash

N=5

mutex_hold() {
    while ! mkdir /var/lock/rsync/mutex 2>/dev/null; do
       sleep 1
    done
}

mutex_release() {
    rmdir /var/lock/rsync/mutex
}

if [[ "$1" = "--server" ]]; then
    shopt -s nullglob

    while mutex_hold && A=(/var/lock/rsync/[0-9]*) && [[ "${#A[@]}" -ge "$N" ]] && mutex_release; do
       sleep 1
    done

    touch /var/lock/rsync/$$

    mutex_release

    rsync.bin "$@"

    rm -f /var/lock/rsync/$$
else
    rsync.bin "$@"
fi

请注意,此脚本大部分未经测试,并且即使被中断,它也缺少必要的陷阱代码来删除锁定文件。它也不会处理任何过时的锁文件等或创建锁目录。

如果您已经开始制作自己的信号量实现,您可能会对我上面使用的mutex感兴趣,以避免计算锁定文件数和创建新锁文件之间的竞争条件,这可能是允许两个(或多个)实例在单个插槽中运行。

在所有这些情况下,您应该确保您的客户端可以优雅地处理连接超时或拒绝连接。

如果你真的想要使用你提出的信号量风格的系统,上面的脚本可能会有一些修改。

相关问题