Ubuntu中的信号量和锁

Ubuntu中的信号量和锁,ubuntu,semaphore,Ubuntu,Semaphore,我有一个备份服务器,它每小时接收许多rsync连接。由于有太多的openrsync实例可能会使其崩溃,因此我想使用。我的想法是: ssh root@backup_server "get_semaphore" #Will hold until semaphore released rsync -avzrL --super --delete local_directory root@backup_server:`localhost` 有什么想法吗?在我看来,您应该考虑直接在服务器端限制并发

我有一个备份服务器,它每小时接收许多
rsync
连接。由于有太多的open
rsync
实例可能会使其崩溃,因此我想使用。我的想法是:

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

有什么想法吗?

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

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

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

(3) 用包装器脚本替换服务器上的rsync二进制文件,该脚本将捕获rsync内部使用的--server参数,并暂停,直到插槽可用为止。所述包装器脚本应确保同时执行的自身实例不超过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
请注意,此脚本大部分未经测试,即使被中断,也缺少删除锁定文件所需的陷阱代码。它也不会处理任何过时的锁文件等,也不会创建锁目录

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

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

如果您真的想使用您建议的信号量样式系统,那么上面的脚本可能需要进行一些修改