Добрый день.
Попыталчся написать скрипт, что бы облегчить себе немного жизнь. Небходимо делать резервый копии документов бухгалтерии, кадров , менеджеров и т.д. Именно документов doc, exl, pdf, фото. Размер общей информации на все отделы которые надо сохранить около 50 гигабайт, а винт только на 1 Т.б.Попытка договориться с сотрудниками, что бы они почистили ствои папки, оставив только актуальную инфу ни к чему не привели. Поэтому создал 2 скрипта. Первый делает резервную копию всего - запускать планирую раз в месяц. Второй запускается будет каждый день и копировать файлы только которые созданы или измененны за последние сутки.
Время запуска пишу в кроне. У второго скрипта есть файл конфигурации, который я делаю для каждого отдела отдельно и если у отдела файлы находятся на разных файловых помойках то тогда для этого отдела делаю для каждой файловой помойки свой файл конфигурации (так пытаюсь обойти случай когда одна из файловых помоек не доступ и это не повлияет на процесс поиска и копирования документов). В скрипте сделана попытка отлова ошибок во время работы скрипта и сообщения о них в лог файлах и мне по sms.
Вот сам скрипт
#!/bin/bash
# REV 1.5
# -------------------------------------- FUNCTIONS --------------------------------------------
# ============================== || GET VAR FROM FILECONFIG || =============================
GetEnv ()
{
s_var=`sed -n -e "/$1\=/p" "$FULL_NAME_FILE_CONFIG" | sed -e "s/\($1\=\)//" | sed -e 's/^[ \t]\+//' | sed -e 's/[ \t\n]\+$//'`
if [ -z "$s_var" ]
then
echo "Variable $1 ne opredelena"
exit 1
fi
}
#=============================== || END GET VAR FROM FILECONFIG || ==========================
# ================================ || LOG AND SMS || ======================================
log_and_sms ()
{
case_text=$1
if [ $case_text -lt 5 ]
then
echo "${TEXT_TO_LOG[$case_text]}" >> "$SCRIPTS_DIR/error.log"
else
echo "${TEXT_TO_LOG[$case_text]}" >> "$SCRIPTS_DIR/job.log"
fi
sendsms "${SEND[$case_text]}" >/dev/null
return 0
}
# =============================== || END LOG AND SMS || =================================
#------------------------------------ END FUNCTIOMS ----------------------------------------
# ----------------------------------------- VAR --------------------------------------------
PATH="${PATH}:~/bin"
DIR_CONFIG="/home/locadmin/.config/redbackup"
FILE_CONFIG="$1"
FULL_NAME_FILE_CONFIG="$DIR_CONFIG/$FILE_CONFIG"
CURRENT_YEAR="`date +%Y`"
CURRENT_MOUNTH="`date +%m`"
CURRENT_DAY="`date +%d`"
SHOT_DATE="${CURRENT_YEAR}.${CURRENT_MOUNTH}.${CURRENT_DAY}"
#--------------- Получение значений переменных из конфигурационного файла ---------------------------------
if [ $# -eq 0 ]
then
echo "$SHOT_DATE `date +%H:%M` :: Unknown config file."
exit 1
fi
if [ -s "$FULL_NAME_FILE_CONFIG" ]
then
if [ !$_SERVER_ ]
then
GetEnv SERVER
_SERVER_="$s_var"
fi
if [ !$OTDEL ]
then
GetEnv OTDEL
OTDEL="$s_var"
fi
if [ !$ORDER_BACKUP ]
then
GetEnv ORDER_BACKUP
ORDER_BACKUP="$s_var"
fi
if [ !$FILE_FIND ]
then
GetEnv FILE_FIND
FILE_FIND="$s_var"
fi
if [ !$CURRENT_BACK_DIR ]
then
GetEnv CURRENT_BACK_DIR
CURRENT_BACK_DIR="$s_var"
fi
MOUNT_DIR=(`sed -n -e "/MOUNT DIR/,/END MOUNT DIR/p" "$FULL_NAME_FILE_CONFIG" | sed -e "/^[ \t]*#\+\|^[ \t\n]*$\|DIR/d" | awk -F:: '{ for (i=1; i<=NF; i++) {gsub (/^[ \t]*|[ \t]*$/,"",$i);} print $1" "$2}' `)
echo ${#MOUNT_DIR[@]}
if [ ${#MOUNT_DIR[@]} -eq 0 ]
then
echo "Не указано ни одной сетевой шары"
exit 1
fi
else
echo "$SHOT_DATE `date +%H:%M` :: Config file wich name \<$FULL_NAME_FILE_CONFIG\> not exist." >>"$SCRIPTS_DIR/error.log"
exit 1
fi
#----------------------------------------------------------------------------------------------------
DIR_FOR_BACK="${CURRENT_YEAR}/${CURRENT_MOUNTH}/${CURRENT_DAY}"
CURRENT_DIR="/mnt/backups/${OTDEL}/${ORDER_BACKUP}"
FULL_DIR_FOR_BACKUP="$CURRENT_DIR/ARCH/$DIR_FOR_BACK"
_FILE_FIND_="$FULL_DIR_FOR_BACKUP/$FILE_FIND"
SCRIPTS_DIR="$CURRENT_DIR/SCRIPTS"
DIR_ERROR_LOG="$CURRENT_DIR/LOG/ERROR"
DIR_JOB_LOG="$CURRENT_DIR/LOG/JOB"
FULL_NAME_ERROR_LOG="$DIR_ERROR_LOG/e${SHOT_DATE}.log"
FULL_NAME_JOB_LOG="$DIR_JOB_LOG/j${SHOT_DATE}.log"
# ------------------------------------- TEXT to LOG -----------------------------------------
TEXT_TO_LOG[1]="$SHOT_DATE `date +%H:%M` :: Test connection to server $_SERVER_ are fail"
TEXT_TO_LOG[2]="$SHOT_DATE `date +%H:%M` :: Error mount $MOUNT_SHARA_DIR"
TEXT_TO_LOG[3]="$SHOT_DATE `date +%H:%M` :: The dir $FULL_DIR_FOR_BACKUP is alredy exist. I am stop backup"
TEXT_TO_LOG[4]="$SHOT_DATE `date +%H:%M` :: Copy files with ERROR. See $FULL_NAME_ERROR_LOG logfile."
TEXT_TO_LOG[5]="$SHOT_DATE `date +%H:%M` :: Copy files succesfully"
#--------------------------------------------------------------------------------------------
# -------------------------------------- SEND SMS ------------------------------------------
SEND[1]="ERROR:ping server $_SERVER_ |$OTDEL:$ORDER_BACKUP| date:"
SEND[2]="ERROR:mount $MOUNT_SHARA_DIR |$OTDEL:$ORDER_BACKUP| date:"
SEND[3]="ERROR:dir already exist |$OTDEL:$ORDER_BACKUP| date:"
SEND[4]="ERROR:Copy files with error |$OTDEL:$ORDER_BACKUP| date:"
SEND[5]="backup is succesfully. |$OTDEL:$ORDER_BACKUP| date:"
#---------------------------------------------------------------------------------------------
# --------------------------------------- END VAR --------------------------------------------
# -------------------------------------END FUNCTIONS ------------------------------------------
# ----------------------------------- TEST CONNECTION -----------------------------------------
ping 192.168.70.100 -c 1 >/dev/null
if [ $? -ne 0 ]
then
log_and_sms 1
exit 1
fi
# ---------------------------------------------------------------------------------------------
# ------------------------------ MOUNT $CURRENT_BACKUP_DIR---------------------------------------
count_shara=0
count_mnt=1
echo "pribet ${#MOUNT_DIR[@]}"
while [ $count_shara -lt ${#MOUNT_DIR[@]} ]
do
echo "PRIVET ${MOUNT_DIR[$count_mnt]}"
if [ `ls -a "$CURRENT_BACK_DIR/${MOUNT_DIR[$count_mnt]}" | wc -l` -eq 2 ]
then
if !( mount "${MOUNT_DIR[$count_shara]}" )
then
log_and_sms 2
exit 1
fi
fi
let count_shara=$count_shara+2
let count_mnt=$count_mnt+2
done
#----------------------------------------------------------------------------------------------
# ------------------ Make dir $DIR_FOR_BACK - where are store backups. -----------------------
if [ -d "$FULL_DIR_FOR_BACKUP" ]
then
log_and_sms 3
count_shara=0
while [ $count_shara -lt ${#MOUNT_DIR[@]} ]
do
umount "${MOUNT_DIR[$count_shara]}"
let count_shara=$count_shara+2
done
exit 1
else
#echo "This dir no exist. Make dir $DIR_FOR_BACK"
mkdir -p "$FULL_DIR_FOR_BACKUP"
fi
# ---------------------------------------------------------------------------------------------
# -------------------------------- SEARCH FILES -----------------------------------------------
cd "$CURRENT_BACK_DIR"
find ./ -type f -mtime -1 > "$_FILE_FIND_"
# ---------------------------------------------------------------------------------------------
#------------------------- COPY FILES FOR BACKUPS -----------------------------------------------------------------------------------------------
cat "$_FILE_FIND_" | while read list ; do cp --parents --preserve=timestamps "$list" -t "$FULL_DIR_FOR_BACKUP" 2>"$FULL_NAME_ERROR_LOG" ; done
if [ $? -eq 0 ]
then
if [ -s "$FULL_NAME_ERROR_LOG" ]
then
log_and_sms 4
else
log_and_sms 5
fi
fi
#------------------------------------------------------------------------------------------------------------------------------------------------
cd ../
count_shara=0
while [ $count_shara -lt ${#MOUNT_DIR[@]} ]
do
umount "${MOUNT_DIR[$count_shara]}"
let count_shara=$count_shara+2
done
Вот пример конфигурационного файла
SERVER= ASBEST
OTDEL=kadry
ORDER_BACKUP=daily
FILE_FIND=store_find_file.txt
CURRENT_BACK_DIR=/mnt/asbest/kadry
[MOUNT DIR]
//asbest/Kadry :: kadry
//asbest/pens :: pens
//asbest/iii :: iii
[END MOUNT DIR]
Я не программист, и скрипты болше 4-5 строк раньше не писал - поэтому мой скрипт наверно довольно убог.
Поэтому я и прому помочь его сделать лучше. Что на Ваш взгяд совершенно лишнее а чего не хватает.
Укорово в кривокусти не боюсь.