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
连接。由于有太多的openrsync
实例可能会使其崩溃,因此我想使用。我的想法是:
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
请注意,此脚本大部分未经测试,即使被中断,也缺少删除锁定文件所需的陷阱代码。它也不会处理任何过时的锁文件等,也不会创建锁目录
如果您打算创建自己的信号量实现,那么您可能会对上面我使用的方法感兴趣,以避免计算锁文件的数量和创建新锁文件之间的竞争条件,这可能会允许两个(或更多)实例在单个插槽中运行
在所有这些情况下,您都应该确保您的客户端能够优雅地处理连接超时或被拒绝的连接
如果您真的想使用您建议的信号量样式系统,那么上面的脚本可能需要进行一些修改