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
@+
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.