Bonjour,
Je viens vers vous car je bloque sur un problème d'exécution d'un script avec la crontab.
Pour vous expliquer, j'héberge un serveur minecraft sur mon raspberry et j'ai donc écris un script bash pour pouvoir lancer des sauvegardes automatique du monde.
Le script lors de son exécution doit faire les étapes suivantes :
- Vérifie si le dossier de backup existe sinon le créer
- Envoie un message sur le serveur exécuté dans un screen pour prévenir les joueurs
- Archive de façon incrémental le monde à sauvegarder
- Envoie un message sur le serveur pour prévenir que l'exécution du script est terminé + quelques infos
Mon problème est que lorsque que je lance le script avec la commande :
./backup.sh
Tout ce passe bien, les messages sont envoyé sur le serveur, la sauvegarde est créer. Si c'est la première sauvegarde la taille de l'archive parait logique et contient tout le dossier sauvegardé.
Si je relance le script une seconde fois à la main, l'archivage incremental fonctionne et l'archive créé contient bien uniquement les fichiers modifiés.
Par contre lorsque le script est lancé automatiquement avec la crontab :
0 */3 * * * /home/flashneo/minecraft/backup.sh
Le script se lance bien, le message pour prévenir qu'une sauvegarde commence est bien affiché en jeu, une archive est bien créé mais le problème est qu'elle à une taille ridiculement petite et que le message d'après ne s'affiche pas en jeu...
Je ne sais pas si c'est un problème de droit ou autre car sinon le script ne se lancerais peut-être tout simplement pas ?
Enfin voilà, je viens vers vous car je connais que très peu crontab et je n'arrive pas à solutionner mon problème malgré plusieurs recherches.
Voilà mon fichier backup.sh
#!/bin/bash
################################################################
# #
################################################################
# Configuration ###########################
BACKUP_DIRECTORY="./mnt/library/backupMinecraft"
WORLD_TO_BACKUP="./world"
SCREEN_NAME="serverMinecraft"
ADMIN_PSEUDO="Flashneo"
PREFIX="AutoBackup"
ENABLE_CHAT_MESSAGE=true
ENABLE_ADMIN_MESSAGE=true
CONSOLE_LOG=false
ENABLE_LOG_FILE=true
LOG_FILE="./backup.log"
LOG_ERROR_FILE="./backup.error.log"
###########################################
# Do not modify
DATE_FORMAT="%F_%H%M"
DATE=$(date +$DATE_FORMAT)
ARCHIVE_FILE_NAME=$DATE.tar.gz
ARCHIVE_PATH=$BACKUP_DIRECTORY/$ARCHIVE_FILE_NAME
################################################################
# Minecraft console commands #
################################################################
exec_cmd () {
local COMMAND=$1
if [[ $SCREEN_NAME != "" ]]; then
if screen -ls | grep -q $SCREEN_NAME; then
screen -S $SCREEN_NAME -p 0 -X stuff "$COMMAND$(printf \\r)"
fi
fi
}
send_message () {
if $ENABLE_CHAT_MESSAGE; then
local MESSAGE=$1
exec_cmd "tellraw @a [\"\",{\"text\":\"[\",\"color\":\"white\"},{\"text\":\"$PREFIX\",\"color\":\"dark_gray\"},{\"text\":\"] \",\"color\":\"white\"},{\"text\":\"$MESSAGE\",\"color\":\"gold\"}]"
fi
}
send_message_to_admin () {
if $ENABLE_ADMIN_MESSAGE; then
local MESSAGE=$1
exec_cmd "tellraw $ADMIN_PSEUDO [\"\",{\"text\":\"[\",\"color\":\"white\"},{\"text\":\"$PREFIX\",\"color\":\"dark_gray\"},{\"text\":\"] \",\"color\":\"white\"},{\"text\":\"$MESSAGE\",\"color\":\"gold\"}]"
fi
}
################################################################
# Backup world #
################################################################
backup () {
# Disable world autosaving
exec_cmd "save-off"
send_message "Starting backup of world"
if $CONSOLE_LOG; then
echo "======================================================="
echo "$DATE"
echo "Starting backup of $WORLD_TO_BACKUP"
fi
# Compress files ##########################
local START_TIME=$(date +"%s")
# Compression with incremental (save more space)
tar -z --create --file=$ARCHIVE_PATH --listed-incremental=$BACKUP_DIRECTORY/save.list $WORLD_TO_BACKUP
sync
local END_TIME=$(date +"%s")
##############################################
# Enable world autosaving
exec_cmd "save-on"
# Force world save
exec_cmd "save-all"
# Calculates variables
WORLD_SIZE_BYTES=$(du -b --max-depth=0 $WORLD_TO_BACKUP | awk '{print $1}')
ARCHIVE_SIZE_BYTES=$(du -b $ARCHIVE_PATH | awk '{print $1}')
# Display variables
COMPRESSION_PERCENT=$(( 100 - ($ARCHIVE_SIZE_BYTES * 100 / $WORLD_SIZE_BYTES)))
WORLD_SIZE=$(du -h --max-depth=0 $WORLD_TO_BACKUP | awk '{print $1}')
ARCHIVE_SIZE=$(du -h $ARCHIVE_PATH | awk '{print $1}')
BACKUP_DIRECTORY_SIZE=$(du -h --max-depth=0 $BACKUP_DIRECTORY | awk '{print $1}')
local EXECUTION_TIME=$(($END_TIME - $START_TIME))
# Display ending message ###################
if [[ "$ARCHIVE_SIZE" != "" ]]; then
send_message "Backup finish successfuly !"
send_message_to_admin "Backup finish in $EXECUTION_TIME s, $ARCHIVE_SIZE/$WORLD_SIZE, compression $COMPRESSION_PERCENT%"
send_message_to_admin "Total space used in $BACKUP_DIRECTORY : $BACKUP_DIRECTORY_SIZE"
if $CONSOLE_LOG; then
echo "Backup finish in $EXECUTION_TIME s, $ARCHIVE_SIZE/$WORLD_SIZE, compression $COMPRESSION_PERCENT%"
echo "Total space used in $BACKUP_DIRECTORY : $BACKUP_DIRECTORY_SIZE"
echo "======================================================="
fi
else
send_message "Error in backup process... World not save !"
if $CONSOLE_LOG; then
echo "Error in backup process... World not save !"
echo "======================================================="
fi
fi
}
################################################################
# Restore world #
################################################################
restore () {
local ACTION=$1
if [[ $ACTION == 'restore' ]]; then
echo "Starting restore of $WORLD_TO_BACKUP"
else
echo "Start extracting old backup..."
cd "$BACKUP_DIRECTORY/"
fi
local START_TIME=$(date +"%s")
# Decompress files ##########################
if [[ $ACTION == 'restore' ]]; then
for backup in `ls $BACKUP_DIRECTORY | grep /*.tar`
do
tar --extract --listed-incremental=/dev/null --file $BACKUP_DIRECTORY/$backup
done
else
for backup in `ls | grep /*.tar`
do
tar --extract --listed-incremental=/dev/null --file $backup
done
fi
sync
################################################
local END_TIME=$(date +"%s")
local EXECUTION_TIME=$(($END_TIME - $START_TIME))
if [[ $ACTION == 'restore' ]]; then
echo "Ending restore of world in $EXECUTION_TIME s"
else
echo "Old backup extract in $EXECUTION_TIME s"
cd ../
fi
}
################################################################
# Delete old backup #
################################################################
# To do...
################################################################
# Initialize script #
################################################################
# Save log in file
if $ENABLE_LOG_FILE; then
exec 1>>$LOG_FILE
exec 2>>$LOG_ERROR_FILE
fi
# Create backup directory if not exist
if ! [[ -d $BACKUP_DIRECTORY ]]; then
mkdir $BACKUP_DIRECTORY
fi
# Redirect function
if [[ $1 != '' && $1 == '-restore' ]]; then
restore "restore"
else
backup
fi
Et un screen de mon dossier backupMinecraft ou on peut voir la taille de l'archive (sachant que la première sauvegarde à été lancé manuellement et les autres automatiquement) :
Edit: C'était simplement un problème dans mes variables, le chemin était relatif alors qu'il faut le chemin complet.