вторник, 27 ноября 2018 г.

Автоматизация процессов. Запуск и остановка в Linux клиента pCloud по расписанию через скрипты bash

Если Вы ещё не знаете про pCloud, то можете почитать эту публикацию.

pCloud для Linux предлагает приложение синхронизации для Linux в виде appimage (самую свежую версию можно взять здесь). Решение на первый взгляд простого вопроса автоматизации процесса "запуск клиента – синхронизация – выключение клиента" привело к необходимости решения нескольких задач, связанных с особенностями работы клиента pCloud. Решение приводится применительно к графическому окружению xfce.

В конечном счёте решение по автоматизации автоматизация процесса вылилось в запуск двух или трёх заданий по расписанию (см. пользовательское задание cron).

Запуск клиента pCloud

Для запуска клиента используется простой скрипт, например pcloud1.sh

#!/bin/bash
/путь_до_файла/pcloud

А команда пользовательского задания представляет из себя

export DISPLAY=:0 && /path/pcloud1.sh

path – путь до скрипта pcloud1.sh

Первоначальное добавление в pcloud1.sh строки exit (завершение pcloud1.sh) не привело к желаемому результату. В диспетчере задач наблюдалось 2 процесса:

pcloud1.sh
sh -c export DISPLAY=:0 && /path/pcloud1.sh

Чтобы pcloud1.sh "не висел" в менеджере задач был создан скрипт pcloud2.sh, запускаемые по расписанию через минуту после запуска pcloud1.sh  Скрипт представляет из себя "просьбу" завершить все имеющиеся процессы с наименованием pcloud1.sh

#!/bin/bash
killall -s TERM pcloud1.sh
sleep 1 && exit

Остановка клиента pCloud

Данный скрипт, с точки зрения его создания, явился наиболее трудоёмким, что объясняется двумя причинами.

Вопрос 1. Работа клиента стала сопровождаться несколькими процессами. Например, при запуске клиента и следующим за ним автоматическим открытием всех окон в диспетчере задач можно увидеть 6 процессов pcloud:


После закрытия основного окна клиента и экземпляра менеджера файлов, отображающего содержимое облака pCloudDrive в диспетчере задач останется 5 процессов pcloud:


Так как терминальной команды для завершения работы клиента не существует, то по аналогии с MEGA и Облако@Mail.Ru можно применить решение по "мягкому" завершению процесса pcloud по его значению pid, то есть командой kill -15 pid_pcloud

Но если запросить pid процесса pcloud, то в результате будет получено либо 6 групп цифр, соответствующих pid процессам pcloud (пример: 16129 16103 16077 16048 16036 16032), либо 5 групп (пример: 29419 29398 29352 29324 29320). Данные значения pid будут каждый раз меняться.

Количество процессов (5 или 6) зависит от того, открыты ли у Вас все окна, открываемые автоматически при запуске клиента, либо эти окна закрыты и активен только значок состояния на подставке рабочего стола (системной панели, трее).

Возникает закономерный вопрос: а какой именно процесс необходимо выключать?

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



Если после выключения клиента pCloud окно клиента (верхний рисунок) изчезнет, то второе окно так и останется открытым. Содержимое второго окна будет пустым, так как в процессе завершения работы клиента облако pCloud было размонтировано.

Вопрос: и как его автоматически закрыть?

Примечание. Вопрос о закрытии открытого окна приложения pCloud не ставится, так как в xfce значок на панели (системном лотке, трее) отображает только состояние "синхронизировано" или "синхронизируется". Сведения о количестве загружаемых или скачиваемых файлов, а также скорости процесса отображаются в нижней части открытого окна приложения pCloud.

Отвечать на поставленные вопросы будем последовательно.

Ответ 1.  Экспериментально было установлено, что для выхода клиента pcloud необходимо выключать процесс pcloud с самым маленьким значением pid, что соответствует процессу pCloud Drive (см. диспетчер задач). Поэтому самой трудной задачей автоматизации будет являться выборка из полученных значений наименьшего pid, чтобы потом его назначить переменной.

Как оказалось, эту задачу можно решить, по крайней мере, четырьмя способами. Кроме того, "мягкое" выключение всех процессов pcloud можно осуществить командой killall c указанием имени процесса. Так как все решения, которых набирается 5, ведут к одному и тому же результату, то ниже следует их перечисление.

1 вариант:  killall -s TERM pcloud

Здесь всё понятно. Выдаётся команда на завершение всех процессов pcloud.

Следующие три способа представляют из себя ряд последовательных операций. Сначала производится получение значений pid всех экземпляров pcloud и их запись в файл (например pcloud.txt). Содержание файла представляет из себя последовательность из 5-ти или 6-ти групп цифр (см. пояснение выше). Далее "вылавливается" последняя группа (5 цифр) из полученного ряда значений pid и присваивается переменной (например VAR). Заключительное действие является выполнением команды kill -15 $VAR, что равносильно выполнению kill -15 с указанием наименьшего значения pid из файла pcloud.txt

2, 3, 4 варианты:

pidof pcloud> ~/pcloud.txt
VAR=`cat ~/pcloud.txt | grep -o [0-9]*$`
kill -15 $VAR

pidof pcloud> ~/pcloud.txt
VAR=`cat ~/pcloud.txt | awk '{print $NF}'`
kill -15 $VAR

pidof pcloud> ~/pcloud.txt
VAR=`cat ~/pcloud.txt | rev | cut -d' ' -f 1 | rev
kill -15 $VAR

Варианты 1–4 были предложены пользователи форума Linuxmint.com.ru с никами slant (2), Chocobo (3 и 4), demonlibra (1). Пользуясь случаем, хотелось бы ещё раз выразить им свою благодарность.

5 вариант

При получении списка pid процессов pcloud командой pgrep результат в файле pcloud.txt будет представлен "в столбик", то есть каждое значение pid будет располагаться в новой строке в порядке их возрастания, например:

29320
29324
29352
29398
29419

Следующим шагом будет являться присвоение переменной значения самой первой строки файла pcloud.txt

pgrep pcloud> ~/pcloud.txt
VAR=`sed -n '1p' ~/pcloud.txt`
kill -15 $VAR

Содержание файла pcloud.txt будет перезаписываться при каждом выполнении команды pidof pcloud> ~/pcloud.txt  Но если наличие этого "один раз нужного" файла слишком нервирует, то для его удаления можно добавить команду rm ~/pcloud.txt

Ответ 2.  Несмотря на кажущуюся простоту команды закрытия активного окна Thunar командой thunar -q (получена после выполнения в терминале thunar --help), в рассматриваемом случае она не срабатывает.

После рассмотрения дерева процессов обнаружено, что в перечне активных процессов имеется Thunar --daemon :


Закрыть открытое клиентом pCloud окно Thunar можно тремя способами:

а) завершить все активные процессы Thunar   killall -s TERM /usr/bin/Thunar ;

б) получить pid процесса Thunar, записать его в переменную и завершить его командой kill -15 значение_переменной

OUTPUT="$(pidof /usr/bin/thunar)"
kill -15 ${OUTPUT}

в) получить pid процесса Thunar, записать его в файл, присвоить переменной значение, полученное из чтения файла и завершить его командой kill -15 значение_переменной

pidof /usr/bin/Thunar> ~/thunar.txt
VAR2=`cat ~/thunar.txt`
kill -15 $VAR2

Содержание файла thunar.txt будет перезаписываться при каждом выполнении команды pidof /usr/bin/Thunar> ~/thunar.txt  Но если наличие этого "один раз нужного" файла слишком нервирует, то для его удаления можно добавить команду rm ~/thunar.txt

Все варианты равнозначны. Результатом их выполнения является завершение процессов thunar --daemon и Thunar (соответствует открытому окну с содержимым каталога pCloudDrive).

По вопросу "важности" процесса thunar --daemon на англоязычном форуме была найдена информация, что на функциональность Thunar и системы в целом это существенного влияния не оказывает. Единственный минус заключается в том, что без этого процесса подсоединённый съёмный носитель (например, флэшка) автоматически смонтирован будет только при открытом окне Thunar. Если никакого экземпляра Thunar не запущено, то съёмный носитель автоматически не монтируется. В этом случае придётся открыть Thunar и осуществить монтирование вручную, например:


В любом случае после очередного запуска системы thunar --daemon будет запущен автоматически


что определяется содержанием файла

/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-session.xml  (см. --daemon)

<property name="Client2_PerScreen" type="bool" value="false"/>
      <property name="Client3_Command" type="array">
        <value type="string" value="Thunar"/>
        <value type="string" value="--daemon"/>
      </property>

Итого, скрипт завершения работы клиента pCloud (например pcloud3.sh) может быть следующего содержания (выбирается один вариант и один способ):

#!/bin/bash
вариант  1, 2, 3, 4, 5
sleep 5
способ   а, б, с
sleep 5 && exit

Команда 5-секундной паузы slеep 5 была введена в целях тестирования  скрипта для наблюдения за процессами. В рабочем скрипте её можно не использовать.


Пример пользовательского задания cron для ежедневной 40-минутной автоматической синхронизации с облаком pCloud с 21:40 до 22:20

40 21 * * * export DISPLAY=:0 && /home/user/Tools/scripts/pcloud1.sh
41 21 * * * /home/user/Tools/scripts/pcloud2.sh
20 22 * * * /home/user/Tools/scripts/pcloud3.sh

Если ограничиться только скриптами запуска и выключения, то есть pcloud1.sh и pcloud3.sh, то скрипт pcloud3.sh должен выключать pcloud c процессом pid не наименьшим, а на единицу больше, то есть из полученного ряда значений, например,

28354 28355 28359 28371 28399 28426 28449 28684 ,

должно быть выбрано второе (28355). Объясняется тем, то 28354 соответствует активному скрипту pcloud1.sh.

Соответственно, в этом случае для выключения процессов pcloud будет использоваться такой код:

pgrep pcloud> ~/pcloud.txt
VAR=`sed -n '2p' ~/pcloud.txt`
kill -15 $VAR

Тогда пользовательское задание приобретает вид, например:

40 21 * * * export DISPLAY=:0 && /home/user/Tools/scripts/pcloud1.sh
20 22 * * * /home/user/Tools/scripts/pcloud3.sh

Комментариев нет:

Отправить комментарий