Syncronisation directories made in romano

Introduction : Je viens d’avoir la fibre optique chez moi (avec donc un bloc IPv6 et un débit de 500mg/sec) donc je me suis dis que j’allais m’installer un serveur chez moi. J’ai fais une réplication de mon serveur MySQL mais j’ai plein de fichiers « plats » qui pour l’instant sont créés sur mon serveur au Canada. Et malgré la replication MySQL j’ai plein de données pour le serveur de chez moi qu’il faut que je mette à jour régulièrement.
Infos : je n’ai configuré que le vhost https://ww3.zw3b.fr (IPv6 only) pour le moment.

Donc, je me suis créais un script qui vérifie si un processus est lancé ; et qui dans ce cas ne relance pas le processus ; et si il n’est pas lancé il le lance.

Il vérifie en local (sur la machine elle-même) si des fichiers sont nouvellement créés ou modifiés ; je les affiches et dans ce cas je lance une connexion RSYNC vers une autre machine pour la synchronisation des fichiers/répertoires.

C’est un début soyez « souple » :

Le fichier pour la crontab :

cat /root/my_process-crontab.sh
#!/bin/bash
#################################################################
# Author : O.Romain Jaillet-ramey (orj AT lab3w.fr)
# Desc : Check process scrypting
# Date Created : 20241016
#################################################################

#####-------------------------- CHECK ----------------------------#####
ID=`id -u`

if [ "x$ID" != "x0" ]; then
        echo "Run as root!"
        exit 1
fi

#EXPECTED_ARGS=3
#E_BADARGS=65

#if [ $# -ne $EXPECTED_ARGS ]
#then
#        echo “Usage: `basename $0` install domain.tld www”
#        exit $E_BADARGS
#fi

#####-------------------------- /CHECK ----------------------------#####

#####-------------------------- DECLARATION ----------------------------#####
MYDIR=`dirname $0`

# Date Actuelle
DATE=`date +%Y%m%d`
DATEFR="2024/10/14 12:39:28"
DATEFR=`date +"%Y/%m/%d %H:%M:%S"`

function check_process_start()
{
        echo "#------------------------------------------------------------------------"
        echo "# Checking processus scripting"
        echo "# Date : $(date +"%Y/%m/%d %H:%M:%S")"
        echo "#-------"
}

function check_process_end()
{
        echo "#-------"
        echo "# Date : $(date +"%Y/%m/%d %H:%M:%S")"
        echo "# End checking processus scripting"
        echo "#------------------------------------------------------------------------"
}

function check_process_synchronization()
{
        echo "|"
        echo "+-> Synchronization -----------------------------------------------------"
        script="/root/my_synchronization.sh"
        command=$(ps x --no-headers | grep "/bin/bash $script" | awk '{print $5" "$6}')

        if [[ "$command" =~ "/bin/bash $script" ]]
        then
                echo "|\\"
                #echo "OK - Process found"
                echo "| +-> Do not start \"Find files for synchronization\" : script already started (wait)"
        else
                echo "|\\"
                #echo "KO - NO Process found"
                echo "| +-> Starting \"Find Files for Synchronization\""

                /root/my_synchronization.sh start

#               echo "|   \\";
                echo "|   +--------------------------------------------------------------------"
        fi

        echo "|"
}

#####-------------------------- START / STOP ----------------------------######

case "$1" in

check)
#       $0 stop
#       echo "$0 Starting"

        check_process_start

        check_process_synchronization

        check_process_end
;;

stop)
        echo "$0 Stop"
        echo "(todo kill process)"

;;

*)
        echo "usage : $0 (check|stop)"
;;

esac

#####-------------------------- START / STOP ----------------------------######

Le script :

cat my_synchronization.sh
#!/bin/bash
#################################################################
# Author : O.Romain Jaillet-ramey (orj AT lab3w.fr)
# Desc : Scripting synchronisation of directories
# Date Created : 20241016
#################################################################

# Date Actuelle
DATE=$(date +%Y%m%d)

# Minute
time_synchro=5

# -----------------

function search_dir_new_file()
{
        IFS=""

        dir=$1

        timestamp_start=$(date +"%s")

        echo -n ""
        echo -n "|   +-> Search for modified files in the \"$dir\" directory "

        search=$(find "$dir" ! -path "${dir}tmp/session/*" -type f \( -iname "*" -or -iname ".*" ! -iname ".htaccess" \) -mmin -${time_synchro} -exec ls -lhQ {} ';'| sed -r 's/(.*)[[:space:]](.*)[[:space:]](.*)[[:space:]](.*)[[:space:]](.*)[[:space:]](.*)[[:space:]](.*)[[:space:]](.*)[[:space:]]"([^"]+)"$/"\9:\5"/g')

        declare -a array="($search)"
        count=$(echo ${#array[@]})

        echo -n "($count)"
        echo "."

        if [ "$count" -ge "1" ]; then

        echo "|   |\\"

        for i in ${array[@]}
        do
                echo "|   | +-> "$i
        done

        # -------------------------------
        rsync_dir_new_file $dir
        # -------------------------------
        fi

        echo "|   |"

        unset array
}


function rsync_dir_new_file()
{
        dir=$1
        dir=$(echo $dir | sed -E 's/\/home\///')

        directory_synchro=${dir}

        directory_locale="/home/"
        directory_remote="/home/"

        # ------------
        # infos : https://howto.zw3b.fr/linux/reseaux/ssh-scp-par-certificats
        auth=`find /tmp -user $LOGNAME -type s -name "*agent*" -print 2>/dev/null`
        SSH_AUTH_SOCK=$auth
        export SSH_AUTH_SOCK

        # Machine distante
        RMACHINE="2a01:cb1d:12:1c00:1ab3:126:42:10"
        RPORT="22"

        # User de la machine distante
        RUSER=root

        # Clé privé passphrase
        RKEY=.ssh/id_ecdsa
        # -------------

        # Options
#       OPTIONS="--force --ignore-errors --delete --delete-excluded --backup"
#        BACKUP_DIR="--backup-dir=${directory_remote}/${directory_synchro}-$DATE"
#       OPTIONS="--delete --delete-excluded"
        OPTIONS="--delete-before"
#       EXCLUDE='--exclude="sess_*"'

        if ! ssh -6 -p $RPORT -i $RKEY $RUSER@$RMACHINE "test pwd"; then
                echo "L'authentification a echoue"
                echo "Exit !"
                exit 2
        fi

        rsync $OPTIONS -az -e "ssh -6 -p $RPORT -i $RKEY" ${directory_locale}/${directory_synchro}/ ${RUSER}@[${RMACHINE}]:${directory_remote}/${directory_synchro}/

        echo "|   |  \\"
        echo "|   |   +-> Rynsc of directory : /var/pro/${directory_synchro}/ -> ${RUSER}@[${RMACHINE}]:/var/pro/${directory_synchro}/"

}

#####-------------------------- START / STOP ----------------------------######

case "$1" in

start)
#       echo "$0 Starting"

        echo "|  \\"

        # Attention pas de slash de fin sur le directories
       search_dir_new_file /home/user1
       search_dir_new_file /home/user2

#       echo "|      \\"
#       echo -n "|       +"
#       echo -n "" ; for i in {1..60}; do echo -n "."; sleep 1; done; echo "End."
#       sleep 60
;;

stop)
        echo "$0 Stop"
        echo "(todo kill process)"
;;

*)
echo "usage : $0 (start|stop)"
;;

esac

La crontab (tâche planifiée) :

*/5 * * * * sleep $(shuf -i 0-60 -n1) ; /root/my_process-crontab.sh check  | mail -s "[ZW3B][CHECK] Modification directories" "user1@domain.tld, usr2@domain.tld" 1>>/var/log/syslog 2>/dev/null 2>&1

Alors là j’analyse - J’ai fixé à 5min la recherche « find » donc je lance le script toutes les 5 minutes. Je me demande si j’ai un gros fichiers que je viens de déposer quelques part et qu’il met 10 minutes à être transférer sur les autres serveurs ; et qu’il y a des fichiers modifiés entre temps, je crois bien que le « find -mmin 5 » ne va pas trouver ces nouveaux fichiers (vu que je ne souhaite pas relancer le processus si il est déjà en cours d’exécution). Il faut que j’y réfléchisse.

En fait c’est juste pour ne pas me connecter aux serveurs distants (en rsync) s’il n’y a pas besoin.


Le rendu du script en cas d’échec :

#------------------------------------------------------------------------
# Start checking processus scripting :
# Date : 2024/10/16 14:04:00
#-------
|
+-> Synchronization -----------------------------------------------------
|\
| +-> Do not start "Find files for synchronization" : script already started (wait)
|
#-------
# Date : 2024/10/16 14:04:01
# End checking processus scripting
#------------------------------------------------------------------------

Le rendu du script en cas de success :

#------------------------------------------------------------------------
# Start checking processus scripting :
# Date : 2024/10/16 15:05:45
#-------
|
+-> Synchronization -----------------------------------------------------
|\
| +-> Starting "Find Files for Synchronization"
|  \
|   +-> Search for modified files in the "/var/pro/web_contents" directory (0).
|   |
|   +-> Search for modified files in the "/var/pro/web_dmarc" directory (0).
|   |
|   +-> Search for modified files in the "/var/pro/web_json" directory (0).
|   |
|   +-> Search for modified files in the "/var/pro/web_public" directory (0).
|   |
|   +-> Search for modified files in the "/var/pro/web_tree" directory (0).
|   |
|   +-> Search for modified files in the "/var/pro/web_usr" directory (0).
|   |
|   +-> Search for modified files in the "/var/pro/web_sites/zw3b_fr/www/tmp/feed" directory (2).
|   |\
|   | +-> /var/pro/web_sites/zw3b_fr/www/tmp/feed/euipo.europa.eu-ohimportal-fr-news-feed-journal-rss-363658.xml:195K
|   | +-> /var/pro/web_sites/zw3b_fr/www/tmp/feed/euipo.europa.eu-ohimportal-fr-news-feed-journal-rss-363658.xml.md5:32
|   |  \
|   |   +-> Rynsc of directory : /var/pro/web_sites/zw3b_fr/www/tmp/feed/ -> root@[2a01:cb1d:12:1c00:1ab3:126:42:10]:/var/pro/web_sites/zw3b_fr/www/tmp/feed/
|   |
|   +--------------------------------------------------------------------
|
#-------
# Date : 2024/10/16 15:06:00
# End checking processus scripting
#------------------------------------------------------------------------

Franchement, c’est comme ré-inventer la roue :upside_down_face:

@+


Note de Moi-même 16h15 GMT+2 :

1ère chose : je transfert un fichier dans le serveur général en FTP de 4.7G (çà met quelques minutes) disons 3 minutes. Le script RSYNC se lance (alors que le transfert FTP n’est pas terminé) et il envoie les 2.7G qui sont arrivé (celui du transfert FTP) sur le serveur de « backup » en RSYNC. Puis le transfert FTP finit. Puis 10 minutes plus tard, mon « find » ne trouve pas le fichier alors le RSYNC ne l’envoie plus. Du genre complètement nul mais tout de plus normal.

Exemple (mon fichier zimbra 9 recompiler ne fonctionne pas) :
Index of /pub/temporaire AT Server at www
Index of /pub/temporaire AT Server at ww3

Faut que je fasse d’autres « test ».

Si vous avez des « conseils » je suis preneur.


je vais « supprimer » ce sujet ; je crois… je ne vois pas de bonne solution ; à part utiliser normalement RSYNC sans faire de recherche locale.

Je le laisse quelques temps histoire de réfléchir.