воскресенье, 10 февраля 2019 г.

Автоматизация процессов в Linux: периодический запуск Dropbox в указанный период времени

Выполнение указанной задачи может быть обусловлено необходимостью отслеживания появления новых файлов (папок) в папке общего доступа (обмена) Dropbox.

В частности, с 19 до 22 часов Dropbox должен запускаться на 10 минут. При этом период между данными запусками должен составить 30 минут.

При завершении этого 10-минутного сеанса работы папка общего доступа (обмена) должна быть проверена на наличие новых файлов/папок. Если такие файлы/папки имеются, то они подлежат перемещению в другую папку. Затем папка назначения открывается сопоставленным менеджером файлов (nautilus, nemo, caja, thunar).

Так как готового решения, на первый взгляд, не существует, то пришлось создать "самопальное" решение на bash. Может быть, кому-нибудь пригодится это решение или его отдельные элементы.


Задача является комплексной и состоит из нескольких отдельных задач:

– проверка наличия уже существующего процесса Dropbox;

– запуск 10-минутного сеанса работы;

– проверка наличия файлов/папок в папке общего доступа;

– назначение периодического пользовательского задания cron.


Проверка существования запущенного сеанса Dropbox обусловлена тем, что в назначенное время Dropbox может быть запущен вручную для выполнения какой-либо синхронизации. Если Dropbox уже запущен, то он должен быть остановлен.

Основным процессом Dropbox является выполняемая задача

dropbox-dist/dropbox-lnx.x86_64-.../dropbox , где в качестве многоточния указана версия используемого в настоящее время клиента. Но момент написания данной публикации такой версией является 66.4.84, поэтому в диспетчере задач необходимо произвести поиск задачи

dropbox-dist/dropbox-lnx.x86_64-66.4.84/dropbox

C течением времени клиент обновляется, поэтому версия будет постоянно меняться. По этой причине выполняющий данную проверку скрипт будет использовать несколько переменных.

1. Определяется текущая версия ПО Dropbox

ver=`cat ~/.dropbox-dist/VERSION`

2. Нас основании текущей версии указывается имя задачи для поиска

task=dropbox-dist/dropbox-lnx.x86_64-$ver/dropbox

3. Осуществляется поиск задачи Dropbox. Результат имеет два варианта: 0 – Dropbox не запущен, 1 – Dropbox запущен. Результат записывается в файл dropbox.txt  Расположение данного файла указано для моих нужд, у Вас оно определяется Вами. При выводе результата в файл dropbox.txt предыдущее значение заменяется новым, поэтому необходимости в последующем удалении данного файла не имеется.

ps ax | grep -v grep | grep $task | wc -l > ~/scripts/dropbox.txt

4. Для следующей операции сравнения "если ... то ..." производится считывание значения, записанного в файл dropbox.txt

value=`cat ~/scripts/dropbox.txt`

5. Если Dropbox не запущен (в dropbox.txt записан 0), то никаких действий не производится. В противном случае (Dropbox запущен) выдаётся команда остановки Dropbox.

 if [ $value -eq 0 ];
then
:
else
dropbox stop
fi

В результате получился следующий скрипт bash, которому условно назначено имя exist.sh

#!/bin/bash
ver=`cat ~/.dropbox-dist/VERSION`
task=dropbox-dist/dropbox-lnx.x86_64-$ver/dropbox
ps ax | grep -v grep | grep $task | wc -l > ~/scripts/dropbox.txt
value=`cat ~/scripts/dropbox.txt`
if [ $value -eq 0 ];
then
:
else
dropbox stop
fi
sleep 5 && exit

Команда 5 секундной паузы введена для "перестраховки", так как после команды остановки Dropbox необходимо 3-5 секунд для закрытия всех открытых подключений.


Проверка наличия в папке обмена новых файлов/папок. Автоматический перенос данных в другую папку.

Определяются переменные: H-1 – общая папка (обмена) Dropbox, H-2 – папка назначения, в которую будут переноситься данные.

D1=/home/user/Dropbox/H-1
D2=/home/user/Work/H-2

Производится подсчёт файлов (соответственно и папок, в которых будут расположены файлы):

count=`find $D1 -type f | wc -l`

Если в результате поиска выдано значение 0 (нет никаких файлов), то не производится никаких действий:

if [ $count -eq 0 ];
then
:

В противном случае всё содержимое папки общего доступа Dropbox копируется в другую папку (назначения):
 
else
cp -r $D1/* $D2

В папке источника данные подлежат удалению. Так как папка общего доступа Dropbox может иметь скрытый файл .dropbox, то он из процесса удаления должен быть исключён. То есть, в папке источника найти все данные и удалить их за исключением файла .dropbox:

find $D1/* ! -name '.dropbox' -delete

В папке назначения наоборот – найти и удалить скопированный из папки источника файл .dropbox, так как команда cp -r будет копировать всё, в том числе и скрытые файлы/папки: 

find $D2 -name '.dropbox' -delete

Завершить цикл и открыть папку назначения в файловом менеджере:

fi
xdg-open $D2

Листинг скрипта (например, do.sh) на bash:

#!/bin/bash
D1=/home/user/Dropbox/H-1
D2=/home/user/Work/H-2
count=`find $D1 -type f | wc -l`
if [ $count -eq 0 ];
then
:
else
cp -r $D1/* $D2
find $D1/* ! -name '.dropbox' -delete
find $D2 -name '.dropbox' -delete
fi
xdg-open $D2
exit

Если соответствующая переменной D1 папка является вложенной папкой общей папки Dropbox, то в ней файл .dropbox будет отсутствовать. В таком случае скрипт упрощается:

#!/bin/bash
D1=/home/user/Dropbox/H-1
D2=/home/user/Work/H-2
count=`find $D1 -type f | wc -l`
if [ $count -eq 0 ];
then
:
else
cp -r $D1/* $D2
find $D1/* -delete
fi
xdg-open $D2
exit

Возможно, что вместо переноса данных в другую папку и последующего открытия файлового менеджера Вам необходимо просто информирование на экране, например:


Отображение в Linux Mint 18.3 xfce


Отображение в Linux Mint 19.1 xfce

В этом случае можно использовать скрипт:

#!/bin/bash
DIR=/home/user/Dropbox/H-1
count=`find $DIR -type f | wc -l`
if [ $count -eq 0 ];
then
:
else
zenity --width=200 --height=50 --info --text "\nВ каталоге H-1 имеются данные" 2>/dev/null
fi
exit

Команда zenity вызывает отображение сообщения на экране монитора, которое будет отображаться до тех пор, пока пользователь не нажмёт кнопку OK.

--width=200 --height=50 указывает на ширину и высоту отображаемого окна. В Linux Mint 18.3 в этом не было необходимости, а в Linux Mint 19.1 такие параметры уже пришлось ввести.

Символ \n соответствует команде "перейти на новую строку". Введено для более лучшего визуального восприятия сообщения.



Скрипт 10-минутного сеанса работы Dropbox состоит из двух вышеописанных и команд запуска/остановки Dropbox.

#!/bin/bash
~/scripts/exist.sh
dropbox start -i
sleep 600
~/scripts/do.sh
dropbox stop
sleep 5 && exit

Команда 5 секундной паузы введена для "перестраховки", так как после команды остановки Dropbox необходимо 3-5 секунд для закрытия всех открытых подключений.


Периодический запуск Dropbox в указанный промежуток времени осуществляется через пользовательское задание cron. Запустите в терминале crontab -e и назначьте задание. Для описанной задачи, например:

*/30 19-22 * * * export DISPLAY=:0 && /путь_к_скрипту

1 комментарий:

  1. RSYNC не рассматривали для этих целей? пример ниже (синхронизация и, если удачно, последующее удаление).

    rsync -a --compress=9 --timeout=120 rsync://SOURCE/* DESTINATION >>log.log 2>&1
    if (($? ==0)); then
    rsync -vrd --delete $TMP_BACKUP/ rsync://SOURCE
    # $TMP_BACKUP пустая папка для обнуления исходной

    ОтветитьУдалить