Para começar, note que qualquer "solução de sinalização" pode ter condições de corrida não óbvias. Cuidado para não perder um sinal enquanto processa o último sinal!
Uma ideia simples poderia ser o seu servidor anexar linhas a um arquivo local. Então, cada inotify causaria:
date +"%s" >> /path/to/sync-signals.log
Em seus clientes, assista a esse arquivo via ssh / tail, mas qualquer ação de pull é invocada no cliente.
ssh server "tail -n1 -f /path/to/sync-signals.log" | while read -r sigdate; do
pull from server
done
Observe que esta solução nunca deve perder nenhum "sinal", mas pode causar muitos "traps" desnecessários, caso o servidor acrescente muitos sinais em um curto espaço de tempo. Então, os clientes enquanto loop também deve comparar o último "sigdate" com a data atual de alguma forma. Ou melhor, o servidor atrasaria o sinal de alguma forma (apenas acrescentar uma linha se nada mudou desde alguns segundos.)