Коллекция скриптов

На данной странице содержатся простые bash-скрипты разного назначения , применимые в администрировании.

Копирование выборочного списка директорий из файла file.txt через rsync на удалённый сервер:

filet.txt:

dir1
dir2
dir3
...
dir10050
chmod +x copy.sh:

#!/bin/bash

while read dir 
do 
	cd /home/sites; rsync -av --progress --exclude='www/upload' --exclude='www/upload_local' --exclude='www/upload_all' ./$dir/ root@tremote_server:/data/dir_sites/$dir
done
cat file.txt | copy.sh

Файлы будут скопированы на сервер при условии, что доступ осуществляется по ключу.

Таким же методом можно использовать pipe для передачи значений в цикл других консольных команд типа find, ls и т.п. в зависимости от задачи.


Резервное копирование и хранение последних 10 копий MySQL:

Для примера, возьмем результат работы mysqldump, который по крону ежедневно создает сжатый дамп БД и оставляет только копии за 10 последних дней:

/usr/bin/mysqldump <db_name> | /bin/gzip | /bin/dd of=/home/bitrix/backup_mysql/db_name_`date +%Y_%m_%d`.sql.gz
/bin/rm -f `ls -1 /home/bitrix/backup_mysql/db_name* | head -n -10`

Скрипт оставит имеющиеся 10 копий, а всё, что скапливается старше – удалит.


Логирование сетевых соединений сервера:

#!/bin/bash
CURDATE=/var/log/netstat-statistics/`date +%Y`/`date +%m`/`date +%d`
if [ ! -d $CURDATE ] ; then mkdir -p $CURDATE; fi
/bin/netstat -ntp | grep 'php' > $CURDATE/stat-`date +%Y-%m-%d_%H-%M-%S`

Ежеминутно создается файл с сетевыми соединениями, удобно для траблшутинга при возникновении проблем, например, смотреть по состояниям SYN_SENT


Очистка списка таблиц MySQL:

#!/bin/bash

# script.sh

while read table
do
mysql --defaults-extra-file='/root/.my.cnf' database_name -NBe "TRUNCATE TABLE $table;"
done
cat table_name.txt | script.sh

Архивация измененных файлов после git pull:

#!/bin/bash

# Получение хеша текущего комита
commit1=`git log --pretty=format:"%H" | head -n 1`

# Выкатка релиза
cd /data/project && git pull origin master

# Получение нового хеша текущего комита
commit2=`git log --pretty=format:"%H" | head -n 1`

# Просмотр разницы в виде списка файлов между двумя комитами
files=`git diff --name-only $commit1 $commit2`

# Создание временной директории для хранения измененных файлов
if [ ! -d /data/project/release-files/tmp ] ;
then mkdir -p /data/project/release-files/tmp
fi

tmp="/data/project/release-files/tmp"

# Имя будущего архива
curdate=/data/project/release-files/`date +%Y-%m-%d_%H-%M-%S`.tar

# Вывод списка файлов и копирование во временную директорию
for line in $files
do
cp $line $tmp/`basename $line`
done

# Создание архива и удаление временных файлов
cd $tmp
tar cf $curdate * && rm -rf $tmp/*