четверг, 15 ноября 2018 г.

Автоматизация процессов. Остановка в Linux клиента Mega по расписанию через скрипт bash

Одной из задач, решение которых потребовало времени, явилась необходимость выполнения команды остановки работы графических клиентов клиентов Mega и Облако@Mail.Ru без участия оператора компьютера, то есть производимых по расписанию. Другими словами – организация полной автоматизации циклов "Запуск клиента – Синхронизация – Выход из приложения" .

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

Если с запуском графических клиента синхронизации Mega и Cloud@Mail.Ru вопросов не возникало (запуск осуществляется командами megasync и cloud), то как останавливать их работу без вызова контекстного меню управления через значок системного лотка (трея) было не понятно.

В конце концов было выяснено, что таких терминальных команд для указанных графических клиентов не существует (или мне их так и не удалось найти), поэтому завершение работы приложения пришлось осуществлять через закрытие процесса (megasync или cloud). Например, в диспетчере задач XFCE указанные процессы отображаются как:



Как пишет автор этой публикации, чтобы "попросить процесс (вежливо) остановиться" используется команда SIGTERM, соответствующая выполнению команды kill -15.

В ходе практической проверки команда kill -15 megasync (то есть с указанием имени процесса) не была выполнена, так как SIGTERM вместо имени процесса требует указывать его pid. Поэтому перед выполнением SIGTERM требуется получить pid процесса megasync, который каждый раз будет разным.

Получение pid процесса megasync осуществляется командой pidof megasync

Первоначальное решение заключалось в записи полученного pid в файл

pidof megasync > /home/minter/megasync.txt

и последующей записи pid в переменную путём считыванием 1-й строки megasync.txt

MYVAR=`sed -n '1p' /home/minter/megasync.txt`

Примечание.  /home/minter/ можно заменить на ~/

Далее осуществляется выполнение kill -15 $MYVAR, то есть kill -15 pid-megasync

Желаемый результат был достигнут, а промежуточные данные в виде файла megasync.txt подлежали удалению: rm /home/minter/megasync.txt

Полный текст скрипта составил:

#!/bin/bash
pidof megasync > /home/minter/megasync.txt
MYVAR=`sed -n '1p' /home/minter/megasync.txt`
kill -15 $MYVAR
rm /home/minter/megasync.txt
exit

Однако впоследствии были предприняты поиски решения, при котором полученный pid можно было бы кратковременно запомнить и подставить это значение в kill -15 pid-megasync.

Благодаря автору этой публикации, решение данной задачи свелось к двум строкам кода:

OUTPUT="$(pidof megasync)"
kill -15 ${OUTPUT}

После подстановки полученного ${OUTPUT} после kill -15 было реализовано "мягкое" завершение работы процесса megasync, которое по своему функционалу соответствует команде "Выход", вызываемой из графического индикатора клиента MegaSync.

Скрипт был оформлен как файл sh и ему было назначено выполнение по расписанию.

#!/bin/bash
OUTPUT="$(pidof megasync)"
kill -15 ${OUTPUT}
exit

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

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