在我看來,你應該看在服務器端直接限制併發連接數,這樣你就不必做任何極端的客戶端:
(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 "[email protected]"
rm -f /var/lock/rsync/$$
else
rsync.bin "[email protected]"
fi
請注意,這個腳本主要是未經測試並缺乏必要的陷阱代碼,如果中斷,甚至刪除鎖文件。它也不會處理任何陳舊的鎖定文件等或創建鎖定目錄。
如果您對制定自己的信號量有所建議,您可能會對我上面使用的mutex感興趣,以避免計算鎖文件數量和創建新的鎖文件之間的競爭狀態,這可能允許兩個(或更多)實例在單個插槽中運行。
在所有這些情況下,您應確保您的客戶端可以正常處理連接超時或拒絕連接。
如果您確實想按照您的建議使用信號樣式系統,則上面的腳本可能會進行一些修改。