gpt4 book ai didi

ubuntu - Ubuntu 中的信号量和锁

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:53 28 4
gpt4 key购买 nike

我有一个备份服务器,它每小时接收许多 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) 如果您在守护进程模式下运行 rsync,则 rsyncd.conf 有一个 max connections 选项。

(2) 在 Linux 上,您可以使用 iptables 及其 connlimit 模块来 limit从一个或多个远程主机到端口的并发连接数。您可能必须强制任何 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

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

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

在所有这些情况下,您应该确保您的客户端能够妥善处理连接超时或拒绝的连接。

如果您真的想像您建议的那样使用信号量样式的系统,则可以对上面的脚本进行一些修改。

关于ubuntu - Ubuntu 中的信号量和锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4317003/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com