Meiner Meinung nach sollten Sie die Anzahl der gleichzeitigen Verbindungen direkt auf der Serverseite begrenzen, so dass Sie auf der Client-Seite nichts Extremes tun müssen:
(1) Wenn Sie rsync im Daemon-Modus ausführen, gibt es eine max connections
Option für rsyncd.conf.
(2) Unter Linux können Sie mit iptables
und seine connlimit
Modul zu Grenze die Anzahl der gleichzeitigen Verbindungen zu einem Anschluss von einem oder mehreren entfernten Hosts. Möglicherweise müssen Sie alle rsync-Clients dazu zwingen, einen anderen Port als Ihre normalen ssh-Benutzer zu verwenden, und eine sshd-Instanz dazu veranlassen, diesen ebenfalls abzuhören.
(3) Ersetzen Sie Ihre rsync-Binärdatei auf dem Server durch ein Wrapper-Skript, das den --server-Parameter abfängt, der intern von rsync verwendet wird, und die Ausführung solange verzögert, bis ein Slot verfügbar ist. Das besagte Wrapper-Skript sollte sicherstellen, dass nicht mehr als N Instanzen von ihm selbst gleichzeitig ausgeführt werden. z.B..
#!/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
Bitte beachten Sie, dass dieses Skript größtenteils ungetestet ist und dass ihm der notwendige Trap-Code fehlt, um die Sperrdatei zu entfernen, selbst wenn sie unterbrochen wird. Es kümmert sich auch nicht um veraltete Sperrdateien usw. oder um die Erstellung des Sperrverzeichnisses.
Wenn Sie Ihre eigene Semaphor-Implementierung erstellen wollen, könnten Sie sich für die Mutex die ich oben verwendet habe, um die Wettlaufbedingung zwischen dem Zählen der Anzahl der Lockfiles und dem Erstellen eines neuen Lockfiles zu vermeiden, die es zwei (oder mehr) Instanzen ermöglichen könnte, in einem einzigen Slot zu laufen.
In all diesen Fällen sollten Sie sicherstellen, dass Ihre Clients in der Lage sind, Verbindungszeitüberschreitungen oder abgewiesene Verbindungen ordnungsgemäß zu behandeln.
Wenn Sie wirklich ein Semaphor-ähnliches System verwenden wollen, wie Sie es vorgeschlagen haben, könnte das obige Skript mit ein paar Änderungen verwendet werden.