Ubuntu中的信号量和锁定

Ada*_*tan 3 ubuntu semaphore

我有一个备份服务器,rsync每小时接收许多连接.由于具有太多打开的rsync实例可能会使其崩溃,我想使用信号量来限制并发实例的数量.我的想法是这样的:

ssh root@backup_server "get_semaphore"     #Will hold until semaphore released
rsync -avzrL --super --delete local_directory root@backup_server:`localhost`
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

thk*_*ala 12

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

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

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

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

#!/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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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