Показаны сообщения с ярлыком очистка. Показать все сообщения
Показаны сообщения с ярлыком очистка. Показать все сообщения

воскресенье, 14 мая 2023 г.

Удаление устаревших файлов приложений 4K Videodownloader и 4K Slideshow Maker

При активном использовании приложений 4K Videodownloader и 4K Slideshow Maker создаются файлы протоколов работы этих приложений log и файлы миграции базы данных  sqlite.migration.bak (при обновлениях ПО 4K Videodownloader). Не было замечено, чтобы данные файлы автоматически удалялись по мере их устаревания.

Файлы 4K Videodownloader расположены в каталоге
~/.local/share/4kdownload.com/4K Video Downloader/4K Video Downloader

Файлы 4K Slideshow Maker  расположены в каталоге
~/.local/share/4kdownload.com/4K Slideshow Maker/4K Slideshow Maker

Для своих нужд был написан маленький сценарий, который при загрузке системы удалит файлы log и sqlite.migration.bak старше 5 суток:

#!/bin/bash
find "/home/minter/.local/share/4kdownload.com/4K Slideshow Maker/4K Slideshow Maker" -name "*.log" -mtime +5 -delete
find "/home/minter/.local/share/4kdownload.com/4K Video Downloader/4K Video Downloader" -name "*.log" -mtime +5 -delete
find "/home/minter/.local/share/4kdownload.com/4K Video Downloader/4K Video Downloader" -name "*.sqlite.migration.bak" -mtime +5 -delete
exit

Примечания. В тексте сценария /minter/ означает домашний каталог пользователя. У Вас он будет под другим именем. Значение +5 указывает на пять полных суток (полные сутки соответствуют 24 часам 00 минутам). Укажите нужное значение, исходя из своих потребностей.

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

#!/bin/bash
if [ $(date '+%w') -eq 1 ];
  then
    find "/home/minter/.local/share/4kdownload.com/4K Slideshow Maker/4K Slideshow Maker" -name "*.log" -mtime +5 -delete
    find "/home/minter/.local/share/4kdownload.com/4K Video Downloader/4K Video Downloader" -name "*.log" -mtime +5 -delete
    find "/home/minter/.local/share/4kdownload.com/4K Video Downloader/4K Video Downloader" -name "*.sqlite.migration.bak" -mtime +5 -delete
  else
    :
fi
exit

В первой строке запрашивается текущий день недели $(date '+%w'). Если он совпадает с понедельником  -eq 1 , то очистка выполняется. В противном случае никаких действий не производится.

суббота, 11 марта 2023 г.

Удаление остатков от работы с rclone в каталоге .cache

При инспекции занимаемого места с домашнем каталоге в ~/.cache были обнаружены остатки от передаваемых когда-то данных через rclone и rclone-browser. остатки представляли собой папки с вложенными папками и файлами в них типов pdf, epub, png, fb2, rtf  И хотя они занимали не так уж и много места ~ 73 МБ, стремление к перфекционизму требовало их удаления, причём по принципу "настроил и забыл".



В стартовый сценарий при входе пользователя в систему были внесены команды поиска и удаления таких каталогов (папок), сроком "старше 48 часов" (mtime +2). 

Про удаление через N дней читайте здесь.

find /home/user/.cache/rclone/vfsMeta -mtime +2 -exec rm -rdf {} \;
find /home/user/.cache/rclone/vfsMeta -mtime +2 -exec rm -rdf {} \;

user ‒ это имя домашнего каталога пользователя user. У вас оно будет своё.

При отсутствии своего стартового сценария аналогичные команды можно использовать отдельно.

Удаление остатков работы с архивами zip в каталоге .cache

Не так давно при случайной инспекции содержания скрытого каталога .cachc своего домашнего каталога (папки) были обнаружены следы, оставшиеся при работе несколько дней назад с архивами zip. Эти упомянутые остатки автоматически не удалились, поэтому возникла задача избавления от этих следов в автоматическом режиме. 


В имеющийся у меня стартовый сценарий, запускаемый при входе пользователя в систему, внесена команда поиска и удаления в ~/.cache папок, имя которых совпадает с .fr-*  В принципе, при отсутствии своего стартового сценария данную команду можно использовать отдельно.

find /home/user/.cache -type d -name ".fr-*" -exec rm -rdf {} \;

user ‒ это имя домашнего каталога пользователя user. У вас оно будет своё.

вторник, 15 февраля 2022 г.

Удаление записей из списка "Приложения" в настройке оповещений Linux Mint xfce

После удаления из системы двух ранее использовавшихся программ было обнаружено, что несмотря на удаление относящихся к данному ПО каталогов из ~/.cache ~/.config ~/.local/share, записи об этих программах остались в списке "Приложения":


Увы, интенсивный поиск в Интернет к желаемому ответу на поставленный вопрос не привёл. Получилось, что "спасение утопающих – дело рук самих утопающих".

Было выяснено, что за оповещения отвечает компонент notifyd. Поиск в файловой системе привёл к его файлу настроек xfce4-notifyd.xml (в файловом менеджере включить отображение скрытых файлов), расположенный в: ~/.config/xfce4/xconf/xfce-perchannel-xml


Открыть этот файл в текстовом редакторе и аккуратно удалить лишние записи от <value type= до (включая) >  Для образца можно посмотреть на предыдущие записи, например, Dropbox и FileZilla, FileZilla и Firefox ...  :


При следующем сеансе работы в системе (у меня это было после перезагрузки) "лишних" записей быть не должно:


Делюсь, может быть кому-либо пригодится  😊

понедельник, 31 января 2022 г.

Очистка старых файлов из кэша foliate

Установка читалки электронных книг foliate вместо имеющейся в комплекте поставки Linux Mint fbreader обусловлено тем, что на моей системе при использовании fbreader перелистывание страниц можно осуществить только клавишей PageDown вместо предпочитаемой мной широкой Space (пробел).

Установку foliate можно выполнить из PPA:

sudo add-apt-repository -y ppa:apandada1/foliate && sudo apt update && sudo apt install -y foliate

В настройках foliate имеются варианты выбора шрифта, отображения вместо 2 столбцов (как по умолчанию) один, а также выключения автопереноса слов:



Читаемые и прочитанные книги складываются в каталог ~/.cache/com.github.johnfactotum.Foliate в виде файлов png – обложки книг и файлов json, которые содержат сведения о странице, на которой завершилось чтение в прошлый раз, с целью автоматического открытия читаемой книги на том же месте. При прошлом просмотре содержания указанного каталога в нём было найдено более 130 файлов.

Несмотря на наличие в настройках команды чистки кэша (раскройте в настройках пункт "Книга"), в силу "ленивости" возникло желание немного автоматизировать данный процесс. Ко всему прочему "жаба душит" за лишние занимаемые килобайты. 😂

Исходя из того, что читать люблю и читаю много 😀, на чтение книги порядка 400-500 страниц у меня уходит 2-3 дня. Принимая во внимание, что за месяц будет прочитано 10-15 книг, при числе > 10 файлов json к кэше (3 дня на книгу) было принято решение о запуске процедуры поиска и удаления файлов старше 30 суток (можно меньше или больше на ваше усмотрение). 

Описание выполнение условия "если число найденных файлов больше, чем" описано в этой заметке, а найти файлы старше N дней и удалить реализуется через параметры команды find.

➙  Примечание. В используемом мной сценарии (скрипте) применяется протоколирование действий. Узнать такие команды можно по наличию слов day, echo и log. Если такой необходимости нет, то строки их содержащие можно удалить.

#!/bin/bash
day=`date '+%d'`
books=/home/user/.cache/com.github.johnfactotum.Foliate  # вместо user указать своё имя пользователя в системе
log=/home/user/Reports/system/$day.txt
echo "$(date '+%H.%M.%S') – запуск задания foliate" >> $log
find $books -type f -name "*.json" | wc -l > /tmp/foliate.txt
value1=10
value2=`cat /tmp/foliate.txt`
if (( $value2 > $value1 )); then
    echo "            найдено файлов json – $value2" >> $log
    echo "            запуск очистки кэша foliate" >> $log
    find $books -name "*.png" -mtime +30 -delete
    find $books -name "*.json" -mtime +30 -delete
    echo "            старые файлы из кэша foliate удалены" >> $log
  else
    echo "            найдено файлов json – $value2" >> $log
    echo "            файлов кэша для удаления не назначено" >> $log
fi
echo "            завершение задания foliate" >> $log
exit

➙  Пояснение. В строках echo "   ..." число пробелов равно 12-ти. 12 символов как раз и занимает отображение времени плюс тире с пробелами слева и справа от него: 
$(date '+%H.%M.%S') – 

Данный скрипт запускается мной при старте системы.

Ниже приводится пример реального протоколирования 30 января:

17.39.02 -- запуск задания foliate
                   найдено файлов json – 2
                   файлов кэша для удаления не назначено
                   завершение задания foliate

На тот момент в кэше были расположены файлы:

4E957209-CFCE-4BC2-9AF6-595CD61B5DBA.json
4E957209-CFCE-4BC2-9AF6-595CD61B5DBA.png
AB3F1A4D-5B5C-4C66-85D4-EF90A90A8796.json

📌  Дополнение. На форуме дали совет запретить использовать трекер положения файлов (позволяет находить файл книги который был перенесен в другой каталог). Настройка производится через dconf:

sudo dconf write /com/github/johnfactotum/Foliate/library/use-tracker false

Возможно, что для выполнения этого действия необходимо будет установить dconf-editor:

sudo apt install dconf-editor

После этого либо использовать верхнюю команду, либо, запустив графическую оболочку dconf-editor (sudo dconf-editor) отключить use-tracker.



Как поясняют, это позволит избежать возможного падения читалки с ошибкой сегментирования и в целом заставит её работать быстрее.

четверг, 15 апреля 2021 г.

Обновление Libre Office повлекло установку дополнительных пакетов

В ходе полученного очередного обновления системы был обновлён Libre Office, который "притащил" за собой ранее удалённые мной из системы пакеты, относящиеся в различных локализациям Libre Office и файлам проверки правописания и словарей.

Как иногда полезно полюбопытствовать, что же устанавливается при обновлении системы.  😃

Пришлось через Synaptic искать данные пакеты и удалять вручную. Если кому интересно, то можно даже одной командой, в результате выполнения которой, как у меня отобразилось в окне терминала, будет удалено 40 пакетов, в результате чего объём занятого дискового пространства уменьшится на 339 MB.

sudo apt purge -y hunspell-de-at-frami hunspell-de-ch-frami hunspell-de-de-frami hunspell-en-au hunspell-en-ca hunspell-en-gb hunspell-en-za hunspell-es hunspell-it hunspell-pt-br hunspell-pt-pt hyphen-de hyphen-fr hyphen-it hyphen-pt-br hyphen-pt-pt libreoffice-help-de libreoffice-help-en-gb libreoffice-help-es libreoffice-help-fr libreoffice-help-it libreoffice-help-pt libreoffice-help-pt-br libreoffice-help-zh-cn libreoffice-help-zh-tw libreoffice-l10n-de libreoffice-l10n-en-gb libreoffice-l10n-en-za libreoffice-l10n-es libreoffice-l10n-fr libreoffice-l10n-it libreoffice-l10n-pt libreoffice-l10n-pt-br libreoffice-l10n-zh-cn libreoffice-l10n-zh-tw mythes-de mythes-de-ch mythes-fr mythes-it mythes-pt-pt

среда, 17 марта 2021 г.

Удаление старых ядер и очистка системы в Linux Mint 20x

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

Однако мне более привычен старый способ удаления лишних ядер и очистки системы от ненужных файлов, который, как показала практика, в Linux Mint 20x не работает. Чтобы он работал в условии необходимо изменить значение vmlinuz* на config*

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

Задачу можно выполнять при каждой загрузке системы, для чего создаваемый сценарий sh поместить в автозагрузку. Файл sh должен иметь разрешение на запуск как программы.

Так как операции могут быть выполнены только с правами суперпользователя (напр., sudo /home/user/clean.sh), то самому скрипту ( clean.sh – так называется у меня. Вы можете ему назначить какое угодно имя ) можно назначить запуск от имени суперпользователя без ввода пароля. Для этого выполните в терминале sudo xed /etc/sudoers и добавьте в него строку:

user ALL=NOPASSWD: путь_к_вашему_скрипту (напр., /home/user/clean.sh)  

user – это ваш логин в системе.

При запуске сценария производится подсчёт ядер в системе. Если количество ядер будет больше 1, то будет осуществлено удаление всех ядер кроме текущего, а также выполнены команды автоочистки и автоудаления ненужных пакетов. Также в процессе будут удалены неиспользуемые модули ядра из каталога /lib/modules

Текст сценария (на примере моего).

#!/bin/bash
folder=/home/minter
kern=`find /boot -name config* | wc -l`
if [ $kern -gt 1 ];
  then
     apt purge -y $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)
     apt autoclean
     apt autoremove -y
     rm $folder/.bash_history
     > 
$folder/.bash_history
fi
exit

Обратите внимание на переменную folder, которая указывает на домашнюю папку пользователя, соответствующую логину пользователя в системе (в приводимом примере – minter). Не ошибитесь, иначе вы получите свой "самый чистый домашний каталог в мире".

Если вам нужно протоколирование действий, то добавьте их в протокол событий, например:

#!/bin/bash
folder=/home/minter
log= ... указать расположение файла
kern=`find /boot -name config* | wc -l`
if [ $kern -gt 1 ];
   then
      echo "$(date '+%H-%M-%S') -- в системе ядер - $kern, удаление ядер." >> $log
      apt purge -y $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)
      echo "$(date '+%H-%M-%S') -- запуск автоочистки." >> $log
      apt autoclean
      echo "$(date '+%H-%M-%S') -- запуск автоудаления." >> $log
      apt autoremove -y
      rm $folder/.bash_history
      > $folder/.bash_history
      echo "$(date '+%H-%M-%S') -- история bash очищена." >> $log
   else
      echo "$(date '+%H-%M-%S') -- очистка системы не требуется." >> $log
fi
exit


Пример практического выполнения.

Листинг каталога /boot до работы clean.sh :

config-5.4.0-66-generic
config-5.4.0-67-generic
grub
initrd.img
initrd.img-5.4.0-66-generic
initrd.img-5.4.0-67-generic
initrd.img.old
System.map-5.4.0-66-generic
System.map-5.4.0-67-generic
vmlinuz
vmlinuz-5.4.0-66-generic
vmlinuz-5.4.0-67-generic
vmlinuz.old

Листинг каталога /boot после работы clean.sh :

config-5.4.0-67-generic
grub
initrd.img
initrd.img-5.4.0-67-generic
initrd.img.old
System.map-5.4.0-67-generic
vmlinuz
vmlinuz-5.4.0-67-generic
vmlinuz.old

среда, 15 января 2020 г.

Удалить неиспользуемые ядра и очистить систему в автоматическом режиме (выбор действия по сценарию)

Идея: создать сценарий (скрипт на bash), по результатам выполнения которого определялась бы необходимость осуществления операции удаления неиспользуемых в системе ядер с последующей очисткой системы от ненужных пакетов.

Примечание. Для Linux Mint 20 и выше смотрите здесь.

В отличие от Windows, Linux обладает меньшей "замусоренностью", но и он, с точки зрения перфекционализма, нуждается в периодической чистке. Пример освобождения системы от ненужных файлов читайте здесь. Что же касается ядер, то при установке новых ядер старые ядра не удаляются и, накапливаясь вместе с сопутствующими модулями (см. каталог /lib/modules), начинают занимать место, которое со временем может достигать солидных значений.

У одного из моих знакомых пользователей Linux таких ядер к настоящему времени уже имеется 17 шт. Ради любопытства мной была предпринята попытка подсчёта примерного суммарного места, занимаемого текущим ядром с сопутствующими ему модулями. Вышло 305,9 Мб. Экстраполируя данное значение на 17 неиспользуемых ядер, получается порядка 5-5,1 Гигабайт дискового пространства, выключенного из полезной деятельности.



Сценарий удаления неиспользуемых ядер

Необходимость осуществления заявленных действий будет определяться по результату подсчёта имеющихся в системе ядер. Подсчёт будет вестись по файлам, расположенным в каталоге /boot, имена которых относятся к той или иной версии ядра. К таким файлам относятся config* , initrd.img* , vmlinuz* .  В рассматриваемом примере подсчёт ведётся по файлам vmlinuz* .

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

Если будет обнаружено, что число ядер больше 1, то будет выполнена команда удаления всех предыдущих ядер. Если будет обнаружено, что число ядер равно 1, то никаких действий предпринято не будет.

Сценарий оформляется как исполняемый файл sh

#!/bin/bash
a=`find /boot -name vmlinuz* | wc -l`
b=1
if [ $a -gt $b ];
  then
  apt purge -y $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)
 else
  :
fi
exit

Примечание: двоеточие соответствует команде "ничего не делать".

Поскольку выполняемые действия требуют полномочий суперпользователя, а выполнять созданный скрипт sh планируется от имени текущего пользователя системы, то в файл /etc/sudoers необходимо внести запись, разрешающую его выполнение (sudo clean.sh) без запроса ввода пароля. Откройте файл в текстовом редакторе, например:

sudo xed /etc/sudoers  или  sudo gedit /etc/sudoers

и внесите строку

имя_текущего_пользователя ALL=NOPASSWD: путь_к_скрипту

Сохраните внесённые изменения и перезагрузите систему. Если вдруг вами была допущена ошибка синтаксиса файл sudoers, то выполните действия, описанные здесь.

В своей системе мной была внесена строка

minter ALL=NOPASSWD: /home/minter/Tools/scripts/clean.sh


Объединение удаления ядер и очистки системы

В своей системе было принято решение об объединении процедур удаления неиспользуемых ядер и автоочистки системы от ненужных файлов в один сценарий. Результаты выполнения заносятся в краткий протокол.

#!/bin/bash
day=`date '+%m.%d'`
a=`find /boot -name vmlinuz* | wc -l`
b=1
log=/home/minter/Reports/system/$day.clean.txt
if [ $a -gt $b ];
 then
  time=`date '+%H-%M-%S'`
  echo "$time -- ядер в системе – $a, запуск удаления ядер." >> $log
  apt purge -y $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)
  sleep 5
  time=`date '+%H-%M-%S'`
  echo "$time -- запуск автоочистки." >> $log
  apt autoclean
  sleep 5
  time=`date '+%H-%M-%S'`
  echo "$time -- запуск автоудаления." >> $log
  apt autoremove -y
else
  time=`date '+%H-%M-%S'`
  echo "$time -- очистка системы не требуется." >> $log
fi
exit

Так как мой компьютер постоянно включён в определённый промежуток времени, то сценарий будет выполняться по пользовательскому заданию cron (у меня – раз в месяц). Если у Вас компьютер включается по случайному выбору временного промежутка, то выполнение сценария имеет смысл или включить в атозагрузку системы, или выполнять вручную, создав соответствующий значок (кнопку) запуска. При использовании пользовательского задания cron команда на выполнение должна быть sudo путь_к_скрипту.

При использовании задания cron данное задание можно оформить как запускаемое от имени root, запустив редактор sudo crontab -e  При этом нет необходимости вносить изменения в файл /etc/sudoers  Однако в этой публикации, в первую очередь, рассматривается возможность выполнения заявленных действий в рамках полномочий обычного пользователя.

Работа сценария была проверена на 3 системах Linux Mint версий 18.3 и 19.3

среда, 17 апреля 2019 г.

Предупреждение о заполненности диска через bash

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

Несмотря на имевшийся ранее опыт эксплуатации жёстких дисков с заполненностью до 99 % , такие диски являлись хранилищами данных, операции записи и удаления на которых производились не ежедневно. На диске с установленной системой такое состояние вряд ли можно считать приемлемым.

Стимулами к автоматизации уведомления о сильной заполненности диска явились сравнительно малая ёмкость винчестера и оказание содействия другу, совершенно недавно переметнувшемуся из союза пользователей Windows в сообщество Linux, имеющему точно такой же винчестер как и у меня объёмом в 500 Гигабайт (при форматировании в основной раздел с файловой системой его объём превращается в 465 Гигабайт).


Так как считается, что заполнять диск данными более чем 90 % не является желательным, а для операций по исправлению ошибок на файловой системе (особенно в ходе которых будут осуществляться попытки перезаписи данных из плохих кластеров в хорошие) может потребоваться не менее 5 % доступного для записи места на диске, то было принято решение автоматически уведомлять о наличии свободного места (доступного пользователю), начиная от его значений в 10 % и ниже. Несмотря также на то, что по сравнению с ntfs файловая система ext4 в значительно меньшей степени подвержена фрагментации, её чрезмерное заполнение может дурно повлиять на производительность. Если кому интересно про дефрагментацию в Linux, то читать здесь.

В публикации рассматривается диск, на котором имеется 1 раздел с установленной системой Linux. Отдельного раздела под /home не создавалось, домашний каталог расположен в корне файловой системы, поэтому в дальнейшем имеется в виду, что диск соответствует /dev/sda1

Автоматизация уведомления достигается запуском скрипта при старте системы или через назначение пользовательского задания cron.

Формируемые в процессе работы скрипта данные записываются в выделенный для этой цели каталог  /home/user/scripts/temp , который в скрипте будет выступать как переменная dest. Создаваемые файлы имеют имена df*.txt, где под символом * понимаются значения от 1 до 6. Под user понимается домашний каталог пользователя, под логином которого осуществлён вход в систему.

Возможно, что скрипт может иметь более элегантное содержание с точки зрения эстетики программирования. Но реализации конкретных действий пришлось искать по крупицам, а автор не программер, а так – погулять вышел.

#!/bin/bash
dest=/home/user/scripts/temp

Получить сведения о дисковом пространстве:

df -h /dev/sda1 > $dest/df1.txt

Файл df1.txt будет иметь примерно такой вывод:


Внимательный пользователь может задаться вопросом о разнице между снимком экрана в GParted (в начале заметки) и только что приведенным. Дело в том, что используются разные алгоритмы подсчёта, при которых какие-то данные учитываются, а какие-то – нет. Кроме того, ряд данных может оказаться недоступным для чтения. 
Определённую информацию о существующих в этом вопросе разночтениях можно получить здесь и здесь. Лично мне понравится комментарий: "Другое дело нужно не забывать о разнице между K/M/G и KiB/MiB/GiB. Собственно за *iB хочется вырвать все конечности маркетологам производителей HDD, которые внедрили K=1000 в информационных системах когда изначально K было 1024 для IT и 1000 для физиков.".
Кроме того, вывод df1.txt отображает более объективную информацию, так как показывает дисковое пространство, которое доступно (см. Дост 44G). "Доступно" – это именно тот объём диска, на который пользователь может осуществить запись данных под своими полномочиями в системе. Часть свободного дискового пространства диска пользователю не доступна для записи.

Из файла df1.txt необходимо получить вывод 5-го столбца и записать его в файл df2.txt

cat $dest/df1.txt | awk '{print($5)}' > $dest/df2.txt


Из полученного результата для дальнейшего использования нужны только цифры, поэтому из df2.txt последовательно удаляются слово Использовано% и символ % . Результаты операций записываются в файлы df3.txt и df4.txt

str=Использовано%
while read LINE; do
echo "${LINE##*$str}"
done < $dest/df2.txt | tee $dest/df3.txt


rev $dest/df3.txt | cut -c 2- | rev > $dest/df4.txt


Так как далее скрипт будет "читать" вывод из файла, то в df4.txt необходимо избавиться от первой строки, которая является пустой. Результат записывается в файл df5.txt

sed -n 2p $dest/df4.txt > $dest/df5.txt


Предупреждение о заполненности диска использует условие "если значение равно x, то y (выводится предупреждение), а если не равно х, то z (ничего не делать).

Выполнение условия реализуется инструкцией:

if [ "значение" -eq x ];
then
вывод предупреждения
else
:
fi

Но параметр -eq не применяется с двузначными числами, поэтому из df5.txt необходимо удалить первый символ и записать результат в df6.txt

rev $dest/df5.txt | cut -c 1 | rev > $dest/df6.txt


Полученный результат уже можно использовать в операциях соответствия заданным условиям.

Предусматривается, что при значениях df6.txt от 0 до 9 будут выводиться предупреждения:

0 – осталось свободно 10 % диска
1 – осталось свободно 9 % диска
2 – осталось свободно 8 % диска
3 – осталось свободно 7 % диска
4 – осталось свободно 6 % диска
5 – осталось свободно 5 % диска
6 – осталось свободно 4 % диска
7 – осталось свободно 3 % диска
8 – осталось свободно 2 % диска
9 – осталось свободно 1 % диска

которые будут отображаться на экране до тех пор, пока пользователь не нажмёт кнопку OK. Содержанию файла df6.txt присваивается переменная value.

value=`cat $dest/df6.txt`
if [ $value -eq 0...9 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 10...1 % диска." 2>/dev/null
else
:
fi

Теоретически, при каждом запуске скрипта в имеющиеся в файлах df*.txt значения будут записываться новыми. Но эти промежуточные данные можно и удалять. Например, удалить перечисленное:

rm $dest/df1.txt $dest/df2.txt $dest/df3.txt $dest/df4.txt $dest/df5.txt $dest/df6.txt

или найти и удалить объекты, совпадающие по шаблону имени – 

find $dest -name df*.txt -delete

Всё было бы неплохо, если бы полученные в df5.txt значения были от 90 и выше. Но они могут быть и 20, и 30, и 70 ... В таком случае если занято 72% диска, то будет выдано предупреждение о наличии только 8% доступного (свободного) места на диске, что далеко не соответствует действительности. Поэтому после получения значения df5.txt производится дополнительное сравнение: если 89 и менее, то всё хорошо и ничего делать не надо, в противном случае необходимо выдавать предупреждения.

Проверка реализуется следующим образом. Читается значение a, которое и является результатом вывода df5.txt  Значению b устанавливается пороговая величина 89. Затем производится сравнение двузначных чисел a и b.

a=`cat $dest/df5.txt`
b=89
if [ $a -le $b ]
then
# 89% и меньше, ничего делать не надо, всё в порядке
else
# команды вывода предупреждения
fi

Команды вывода предупреждений оформляются в отдельный скрипт alarm.sh, который будет запущен в случае else (см. выше).

В конечном итоге получилось 2 скрипта: diskusage.sh и alarm.sh

Листинг diskusage.sh:

#!/bin/bash
dest=/home/user/scripts/temp
df -h /dev/sda1 > $dest/df1.txt
cat $dest/df1.txt | awk '{print($5)}' > $dest/df2.txt
str=Использовано%
while read LINE; do
echo "${LINE##*$str}"
done < $dest/df2.txt | tee $dest/df3.txt
rev $dest/df3.txt | cut -c 2- | rev > $dest/df4.txt
sed -n 2p $dest/df4.txt > $dest/df5.txt
a=`cat $dest/df5.txt`
b=89
if [ $a -le $b ]
then
:
else
/home/user/scripts/alarm.sh
fi
#   Если необходимо удалить все полученные df*.txt
#,  то убрать символ решётки (#) в строке ниже
#find $dest -name df*.txt -delete
exit

Листинг alarm.sh:

#!/bin/bash
level=/home/user/scripts/temp
rev $level/df5.txt | cut -c 1 | rev > $level/df6.txt
value=`cat $dest/df6.txt`
if [ $value -eq 0 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 10 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 1 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 9 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 2 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 8 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 3 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 7 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 4 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 6 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 5 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 5 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 6 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 4 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 7 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 3 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 8 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 2 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 9 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 1 % диска." 2>/dev/null
else
:
fi
exit

То есть, проверочным запускаемым скриптом является diskusage.sh  Если значение a (полученное из файла df5.txt) составит 90 и более, то запускается скрипт alarm.sh

Для приведенных в примере данных файлов df*.txt результат работы скриптов приводится ниже:


вторник, 9 апреля 2019 г.

Очистка объектов Корзины старше N дней через bash


Данная публикация является продолжением более ранней, опубликованной под наименованием "Об автоматизации очистки Корзины в Linux или "страсти" по очистке Корзины через терминал" (https://onformix.blogspot.com/2018/01/trashclean.html).

На тот момент не хватило знаний для реализации последнего пункта "А если необходимо удалить содержимое Корзины только старше N дней?" через скрипт на bash. Но эта нерешённая задача постоянно стимулировала к поиску вариантов её реализации, несмотря на то, что были найдены такие инструменты как autotrash и trash-cli.

Этот процесс напоминал абзац из произведения Пола Андерсона "Патруль времени":

Дорогой мой, вы же ещё ни с чем не управились! Для вас и для меня, с точки зрения нашего индивидуального биологического времени, эту  работу ещё предстоит сделать. И не думайте, пожалуйста, что успех предрешён,  раз он зафиксирован в истории. Время эластично, а  человек обладает свободой воли. Если вы потерпите неудачу, история изменится. Упоминание о вашем успехе пропадёт из её анналов, а моего рассказа об этом успехе не будет. Именно так это и происходило в тех считанных эпизодах, когда Патруль терпел поражение. Работа по этим делам всё ещё ведется, и если там достигнут наконец успеха, то история изменится и окажется, что  успех  был как бы "всегда". Tempus non nascitur, fit [время не рождается само собой, а делается (лат.)], если можно так выразиться.

Решение этой задачи оказалось частным случаем реализации другой – удаления файлов/папок через N дней через скрипт bash.

Можно даже сказать, что они почти идентичны за исключением того, что файл отчёта с перечнем окончательно удалённых объектов из Корзины приводится в более "читабельный" вид, так как перед именем каждого из удалённых объектов указывается ещё и путь /home/user/.local/share/Trash/files/, что делает его не совсем удобным для восприятия.

В процессе очистки от объектов старше N дней используются понятия о структуре Корзины и методике поиска удаления через связку команд find и -delete, которые описаны здесь и здесь.

В процессе генерации отчёта об удалённых объектах, который имеет в скрипте наименование Trash.txt к имени указанного файла добавляются дата удаления (месяц.день) и наименование компьютера H-3. А старые файлы отчёта старше установленного времени очистки Корзины (N) удаляются через N+2 дней.

В приводимом примере N устанавливается равным 3.

Результатом является следующее:

#!/bin/bash
D1=/home/user/.local/share/Trash/files
D2=/home/user/.local/share/Trash/info
D3=/home/user/Reports
file=`find $D1 -type f | wc -l`
if [ $file -eq 0 ];
then
:
else
date=`date '+%m.%d'`
find $D1 -mtime +3 > $D3/Trash-ini.txt
find $D1 -mtime +3 -delete
find $D2 -mtime +3 -delete
fi
str=/home/user/.local/share/Trash/files/
while read LINE; do
echo "${LINE##*$str}"
done < $D3/Trash-ini.txt | tee $D3/$date.H-3.Trash.txt
rm $D3/Trash-ini.txt
dir=`find $D1 -type d -empty | wc -l`
if [ $dir -eq 0 ];
then
:
else
find $D1 ! -name 'files' -empty -delete
fi
file=`find $D3 -name *.H-3.Trash.txt -mtime +5 | wc -l`
if [ $file -eq 0 ];
then
:
else
find $D3 -name *.H-3.Trash.txt -mtime +5 -delete
fi
file=`find $D3 -name *.H-3.Trash.txt -empty | wc -l`
if [ $file -eq 0 ];
then
:
else
find $D3 -name *.H-3.Trash.txt -empty -delete
fi
exit

вторник, 12 февраля 2019 г.

Про удаление файлов/папок через N дней через скрипт bash в Linux

При обмене отдельными файлами или файлами, организованными в папки, непременно возникает вопрос своевременного их удаления как устаревших или потерявших актуальность. Как правило, респонденты не удаляют предоставленные им данные: нет времени, потом, забыл(а) ... В итоге время нахождения контента в папках обмена начинает стремиться к бесконечности. Действительно, чего волноваться? Диски нынче большие, места хватает ...

Описанный ниже вариант используется в целях "найти и удалить контент старше N дней" в папках общего доступа таких ресурсов как Диск Яндекс, Dropbox, MEGA, pCloud. При этом каждая папка имеет свои настройки времени хранения контента, при превышении которого он подлежит удалению.

Примечание 1. Указанные в тексте команды могут быть не оптимальными с точки зрения правильного кодинга. Полагаю, что мне это может быть простительным, так как, не имея в данном вопросе профильного образования, информацию пришлось собирать по кусочкам с разных сайтов. Поэтому, по большому счёту, все приводимые ниже листинги являются своего рода компиляцией уже готовых решений.

Итак, обмен с использованием 5 ресурсов облачного хранения: 4 Яндекс Диска и 1 Dropbox. В каждом их них создана папка общего доступа.

Удалить файлы/папки старше N дней

Удаление устаревших файлов и папок осуществляется в ходе задания, запускаемого через cron, то есть без участия пользователя. В процессе выполнения задания создаются файлы отчётов - списка удалённого контента. При этом в имени файла отчёта содержится дата его создания. Файлы отчётов также подлежат удалению через определённое время (X дней).

Указанные выше операции осуществляются в ходе запуска и работы соответствующих клиентов синхронизации. Но их можно оформить и отдельно. В таком случае изменения в папках общего доступа будут переданы на облачные ресурсы в процессе очередного запуска сеансов синхронизации. Выбор варианта зависит от предпочтений пользователя.

Примечание 2. В силу особенностей запуска по расписанию клиентов pCloud и MEGA удаление в них файлов/папок старше N дней необходимо производить перед выполнением остановки клиента. Про остановку клиента читать здесь и здесь.

Объясняется это тем, что после запуска pcloud и megasync выполнение последующих за ними команд невозможно до тех пор, пока pcloud или megasync активны. А после выключения процессов pcloud или megasync нет синхронизации и, соответственно, передачи изменений в облако.


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

Скрипт очистки использует инструкции "если A, то B и если не А, то С".

if <запрос на соответствие условию>
then <действие 1>
else <действие 2>
fi

Самым первым действием является определения наличия какого-либо контента в папке обмена. Потому что если в ней ничего нет, то и дальнейшие действия не имеют смысла. Поэтому ищем файлы (а соответственно, будут найдены и папки, в которых они содержатся).

Перед выполнением указываются расположение папки для поиска (DIR1) и расположение папки отчётов (DIR2). DIR1 и DIR2 используются для того, чтобы в скрипте не писать каждый раз пути к папкам, заменяя их указанными переменными. Имена DIR1 и DIR2 указаны для примера. Для лучшего восприятия своих скриптов примените понятные Вам имена.

Формулировка условия описывается переменной filecount.

Команда "ничего не делать" соответствует символу двоеточия, то есть : .

DIR1=/home/user/Exchange/Beatrice
DIR2=/home/user/Exchange/Reports
filecount=`find $DIR1 -type f | wc -l`
if [ $filecount -eq 0 ];
then
:

Если же какие-то файлы присутствуют, то выполняется ряд последовательных операций:

– определить текущую дату;

– сформировать файл протокола с датой создания;

– удалить контент старше N дней.

else
date=`date '+%d'`
find $DIR1 -mtime +N > $DIR2/$date.Beatrice.txt
find $DIR1 -mtime +N -delete
fi

Примечание 3.

Результатом выполнения date является установка даты. В указанном выше случае файл будет иметь наименование, например, 18.Beatrice.txt, то есть за 18-число месяца. 


Если в имя файла есть необходимость включать и месяц, то переменная date должна быть указана в виде `date '+%m.%d'` Пример результирующего файла – 04.18.Beartice.txt

 %m соответствует текущему месяцу, а %d – дню месяца.

Примечание 4.
Имеется несколько вариантов команды удаления: 


 find /path -mtime +N -exec rm -rf {} \; 

 find /path -type f -mtime +N | xargs rm -rf  

 find /path -mtime +N -delete

В средней команде указан поиск файлов: -type f   Для папок вводить -type d

На одном из форумов было найдено, что -delete работать будет быстрее. Так как лично мне была более понятна команда -delete, то она и приводится во всех указанных ниже листингах команд.


Уточнение для Dropbox и MEGA. В папках общего доступа таких клиентов могут находиться скрытый файл .dropbox или папка .debris Поэтому целесообразно исключить их из удаления, добавив инструкцию "кроме".

Кроме –  ! -name 'имя_объекта'. Например:

find $DIR1 ! -name '.dropbox' -mtime +N -delete или

find $DIR1 ! -name '.debris' -mtime +N -delete

Примечание 5.

При использовании параметра +N Вы можете быть удивлены тем, что контент будет удалён не через N дней, а позднее. Это связано в тем, что аргумент -mtime интерпретируется как количество целых дней. То есть, -mtime +N означает строго больше , -mtime -N означает строго меньше. Другими словами, если возраст объекта составляет 1 день, 23 часа, 59 минут и 59 секунд, то -mtime +1 обрабатывает его, как будто это 1 день, 0 часов, 0 минут. Связано с особенностями программной реализации.

В итоге получается, что -mtime +1 выбирает файлы, которые были изменены как минимум 2 дня назад. Чтобы получить файлы, измененные не менее 1 дня назад, используйте -mtime +0

Другой способ. Если необходимо удалить файлы старше чем, например, ровно 48 часов, то используйте –daystart: find /path type -f -daystart -mtime +1

Если необходимо указывать минуты, то используется -mmin N, что соответствует утверждению "данные файлы последний раз изменены N минут назад.


Примечание 6.

Для использования других параметров ниже приводится краткая справка.

atime

atime означает время доступа. Эта временная метка сообщает, когда последний раз обращались к файлу. Изменяется, если использовались cat, vim, less или какой-либо другой инструмент для чтения или отображения содержимого файла.

mtime

mtime означает время изменения (модификации). Означает, что содержимое файла было изменено путем редактирования файла. При копировании или переносе в другое место хранения это значение не изменяется.

ctime

ctime означает время изменения статуса. Эта временная метка сообщает, когда был последний раз были изменены свойства и метаданные файла. Метаданные включают права доступа, права собственности, имя и местоположение файла.

Как просмотреть временные метки файла? Командой stat . Пример:

stat ~/winehq.key
Файл: /home/user/winehq.key
Размер: 3220 Блоков: 8 Блок В/В: 4096 обычный файл
Устройство: 801h/2049d Inode: 18880312 Ссылки: 1
Доступ: (0664/-rw-rw-r--) Uid: ( 1000/ minter) Gid: ( 1000/ user)
Доступ: 2018-12-20 03:48:48.108006716 +0300
Модифицирован: 2018-12-19 17:07:25.000000000 +0300
Изменён: 2018-12-20 03:48:42.368059166 +0300
Создан: -

Как узнать, когда был изначально создан файл?

Вы заметили последнюю строку вывода команды stat? В нём указывается «Создан». Можно предположить, что это представляет собой timestmap, когда файл был «рождён» (или создан, если быть более точным).

Хотя ext4 поддерживает временную метку создания, команда stat в настоящее время не может её показать. Возможно, будущие версии команды stat покажут временную метку создания в строке «Создан».

В некоторых случаях нужно выяснить, был ли файл удален и пересоздан заново или это тот самый оригинальный файл. По параметру ctime достоверно сказать об этом нельзя, так как он может меняться при любых изменениях атрибутов. Поэтому нужен другой параметр для проверки. В тот момент, когда файл удаляют и создают заново с тем же именем, большая часть его атрибутов остается неизменной. Меняются в основном два – ctime и inode. ctime покажет, когда последний раз изменились атрибуты файла (совсем не обязательно, что из-за удаления и создания), а inode изменится, так как для операционной системы это будет уже совсем другой файл с новым индексным дескриптором.

Смотреть inode можно двумя способами:

stat
ls -i


Ожидается, что в результате выполнения find $DIR1 -mtime +N -delete будут найдены и удалены все объекты старше N дней. Однако, как говорят, "гладко было на бумаге, да забыли про овраги".

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

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


В этом случае можно использовать условие "посчитаем пустые папки". Если ничего не будет найдено, то ничего и не делаем. Если что-то найдём, то удалим. При этом исключим из удаления саму папку общего доступа (в рассматриваемом случае Beatrice), так как было несколько случаев удаления подобной папки, не содержащей уже никаких данных.

dircount=`find $DIR1 -type d -empty | wc -l`
if [ $dircount -eq 0 ];
then
:
else
find $DIR1 ! -name 'Beatrice' -empty -delete
fi

Аналогичные описанным выше действия применяются и для файлов отчётов. То есть используется алгоритм:

– найти в папке отчетов файлы в имени которых присутствует Beatrice.txt. В самом начале процедуры удаления удаления такой файл был сформирован. Его полное имя будет, например, 18.Beatrice.txt (см. выше);

– если таких файлов не найдено, то ничего не делать;

– при нахождении удалить такие файлы старше X дней.

filecount=`find $DIR2 -name *.Beatrice.txt -mtime +X | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $R -name *.Beatrice.txt -mtime +X -delete
fi

Следует отметить, что файл отчёта будет создаваться всегда. Если никаких объектов для удаления не назначено, то такой файл будет пустым. Следовательно, во избежание "замусоривания" папки отчётов такие файлы необходимо найти и удалить.

filecount=`find $DIR2 -name *.Beatrice.txt -empty | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $R -name *.Beatrice.txt -empty -delete

Завершить выполнение скрипта командой exit

Итого, полный текст скрипта будет иметь вид:

#!/bin/bash
DIR1=/home/user/Exchange/Beatrice
DIR2=/home/user/Exchange/Reports
filecount=`find $DIR1 -type f | wc -l`
if [ $filecount -eq 0 ];
then
:
else
date=`date '+%d'`
find $DIR1 -mtime +N > $DIR2/$date.Beatrice.txt
find $DIR1 -mtime +N -delete
fi
dircount=`find $DIR1 -type d -empty | wc -l`
if [ $dircount -eq 0 ];
then
:
else
find $DIR1 ! -name 'Beatrice' -empty -delete
fi
filecount=`find $DIR2 -name *.Beatrice.txt -mtime +X | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $DIR2 -name *.Beatrice.txt -mtime +X -delete
fi
filecount=`find $DIR2 -name *.Beatrice.txt -empty | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $DIR2 -name *.Beatrice.txt -empty -delete
exit

Оформите как исполняемый файл. Например, clean или clean.sh. Принципиального значения наличие/отсутствие расширения не имеет. Важно лишь то, чтобы такой файл был исполняемым.

Примечание 7. На практике в Linux Mint 19 xfce через свойства файла в менеджере файлов Thunmar файлам без расширения (скриптам) не удавалось установить "исполняемый". В таком случае его можно переименовать из, например, clenan в clean.sh, назначить его исполняемым, а затем переименовать его обратно в clean. "Исполняемость" файла сохранится.

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

#!/bin/bash DIR=/home/user/Exchange/Beatrice
filecount=`find $DIR -type f | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $DIR1 -mtime +N -delete
fi
dircount=`find $DIR -type d -empty | wc -l`
if [ $dircount -eq 0 ];
then
:
else
find $DIR ! -name 'Beatrice' -empty -delete
fi
exit

Примечание 8. Не забывайте про особенность общих папок в Dropbox и MEGA. Добавляйте для них исключения .dropbox и .debris (см. выше).

Запустить клиент и удалить папки/файлы старше N дней

Запуск клиента Диска Яндекс

Поясняющие подробности можно прочитать здесь. Приводится только пример скрипта.

#!/bin/bash
crash=/home/user/.config/yandex-disk/crash.txt
D1=/home/user/.config/yandex-disk
D2=/home/user/scripts/yandex/client-1
if [ -f $crash ]; then
rm -f $D1/crash.txt
else
:
fi
rm -f $D1/config.cfg
rm -f $D1/iid
rm -f $D1/passwd
cp $D2/config.cfg $D1
cp $D2/iid $D1
cp $D2/passwd $D1
yandex-disk start
sleep 60
/home/user/scripts/clean-1
sleep 240
yandex-disk stop
sleep 5 && exit

Примечание 9.

После старта клиента Диска Яндекс (yandex-disk start) даётся время на запуск клиента и его соединение с облаком (sleep 60). Затем осуществляется очистка. После этого даётся 4 минуты на приём/передачу данных (sleep 240), после чего следует команда остановки клиента и завершения работы скрипта. 60 секунд и 240 секунд указаны условно. Пользователь сам определяет сколько времени должно пройти и следует ли ему использовать первое ожидание (sleep 60).


Если на Диске Яндекс больше чем 1 папка обмена, то тогда на каждую папку создаётся свой скрипт. Они, соответственно, должны быть запущены один за другим, например:

/home/user/scripts/clean-1
/home/user/scripts/clean-2
/home/user/scripts/clean-3

Ожидание 5 секунд после команды остановки Диска Яндекс введено "на всякий случай", чтобы гарантировать остановку клиента с используемой конфигураций. Это обусловлено тем, что у меня последовательно другом за другом запускаются 4 Диска Яндекс, каждый со своими настройками.

Если у Вас только 1 учётная запись Диска Яндекса, то нет необходимости переписывать конфигурацию клиента. Скрипт упрощается до вида:

#!/bin/bash
yandex-disk start
sleep 60
/home/user/scripts/clean-1
sleep 240
yandex-disk stop
exit

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

Пример:

#!/bin/bash
dropbox start
sleep 40
/home/user/scripts/clean-4.sh
sleep 260
dropbox stop
exit

Скрипт запуска клиентов с очисткой

Например, у меня оформлен запуск 5-ти клиентов последовательно друг за другом. Перед запуском очереди заданий клиентов Диска Яндекс проверяется наличие уже запущенного экземпляра Диска Яндекс. Если такой экземпляр будет найден, то выдаётся команда на его остановку.

#!/bin/bash
yd=/tmp/yandex-disk-*
if [ -d $yd ]; then
yandex-disk stop
else
:
fi
sleep 5
/home/user/scripts/yandex/client1/daemon
/home/user/scripts/yandex/client2/daemon
/home/user/scripts/yandex/client3/daemon
/home/user/scripts/yandex/client4/daemon
/home/user/scripts/dropboxauto
exit

При включении мной такого задания по расписанию имелось в виду, что каждое задание выполняется не менее 5-ти минут. Следовательно, общее время выполнения указанных заданий составит не менее 25-ти минут. В реальности оно больше за счёт различного рода пауз между отдельными операциями, поэтому его продолжительность была оценена в 30 минут.

понедельник, 8 октября 2018 г.

Изменения в команде удаления старых ядер (Linux Mint 18.3/19)


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


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


Примечание. При удалении через Synaptic в режиме "полного удаления" система по непонятной для меня причине при удалении какого-либо ядра linux-image-...-generic "желает" установить пакет linux-image-unsigned-...-generic (автоматически устанавливает галочку). Поэтому внимательно относитесь к перечню пакетов для удаления, который отобразит Synaptic перед запланированной процедурой.

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

linux-headers-4.15.0-34
linux-headers-4.15.0-34-generic
linux-modules-4.15.0-34-generic
linux-modules-extra-4.15.0-34-generic
linux-image-4.15.0-34-generic

Поэтому командой для полного удаления ядра 4.15.0.34 является

sudo apt purge -y linux-headers-4.15.0-34 linux-headers-4.15.0-34-generic linux-modules-4.15.0-34-generic linux-modules-extra-4.15.0-34-generic linux-image-4.15.0-34-generic

После выполнения указанной команды ядро 4.15.0.34 было полностью удалено.


Если в процессе выполнения команды в окне терминала будет выдано предупреждение:

dpkg: предупреждение: при удалении linux-modules-4.15.0-34-generic каталог «/lib/modules/4.15.0-34-generic» не пуст, поэтому не удалён

то после можно выполнить команду  sudo rm -rf /lib/modules/4.15.0-34-generic

Такая ситуация может наблюдаться, если Вами используется ПО Boinc client.

суббота, 1 сентября 2018 г.

Лишние языковые модули Libre Office в Linux


В ходе общего обновления установленного Linux Mint 19 Cinnamon было случайно обращено внимание на то, что система намерена установить языковые пакеты, не относящиеся к имеющимся в системе установленным языкам. Лишние языки были удалены в ходе первоначальной настройки Linux Mint 19 после установки.

В частности, в перечне устанавливаемых пакетов находились:

libreoffice-help-de
libreoffice-help-en-gb
libreoffice-help-es
libreoffice-help-fr
libreoffice-help-it
libreoffice-help-pt
libreoffice-help-pt-br
libreoffice-help-zh-cn
libreoffice-help-zh-tw
libreoffice-l10n-de
libreoffice-l10n-en-gb
libreoffice-l10n-en-za
libreoffice-l10n-es
libreoffice-l10n-fr
libreoffice-l10n-it
libreoffice-l10n-pt
libreoffice-l10n-pt-br
libreoffice-l10n-zh-cn
libreoffice-l10n-zh-tw

Так как менеджер обновлений отображал предстоящую установку только libreoffice-l10n, а по отдельности данные пакеты при обновлении перечислены не были, то было решено удалить эти пакеты после обновления системы.

В менеджере пакетов Synaptic в поле "Поиск" были сделаны 2 запроса: libreoffice-l10n и libreoffice-help.

Не соответствующие критериям

libreoffice-l10n
libreoffice-l10n-ru
libreoffice-help-ru
libreoffice-help-en-us

пакеты было решено удалить, для чего была составлена команда терминала

sudo apt purge -y libreoffice-help-de libreoffice-help-en-gb libreoffice-help-es libreoffice-help-fr libreoffice-help-it libreoffice-help-pt libreoffice-help-pt-br libreoffice-help-zh-cn libreoffice-help-zh-tw libreoffice-l10n-de libreoffice-l10n-en-gb libreoffice-l10n-en-za libreoffice-l10n-es libreoffice-l10n-fr libreoffice-l10n-it libreoffice-l10n-pt libreoffice-l10n-pt-br libreoffice-l10n-zh-cn libreoffice-l10n-zh-tw

По сообщению в окне терминала к удалению было назначено 19 пакетов, в результате чего на жёстком диске будет освобождено 287 Мб.

среда, 30 мая 2018 г.

Очистка Корзины по условию ("страсти" по автоматизации очистки Корзины в Linux)


Неумное любопытство, а возможно – полезная любознательность, привели к попытке ответа на вопрос: можно ли сделать так, чтобы команда на очистку Корзины" выдавалась только лишь при наличии в ней удалённых объектов?

Вторым до сих пор не решённым вопросом являлось удаление объектов из Корзины старше определённого количества дней.

При рассмотрении этих вопросов предусматривается, что Вы уже имеете представление о структуре Корзины в Linux и способах автоматизации её очистки (подробности).

Корзина не пустая – очищать, Корзина пустая – ничего не делать

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

Скрипт создавался в целях тестирования в рамках решения задачи по полной автоматизации предоставления на Яндекс Диске контента на временной основе (подробности).

Как указывалось в более ранней публикации, в каталоге ~/.local/share/Trash/info находятся сведения о местоположении и времени удаления каждого из объектов каталога ~/.local/share/Trash/files, который и содержит все удалённые файлы и каталоги (~/ следует понимать как домашний каталог текущего пользователя). Удаление указанных каталогов равносильно операции очистки Корзины.

Создадим исполняемый файл со следующим содержанием:

#!/bin/bash
# Очистка Корзины по условию
musor=~/.local/share/Trash/info
if [ -d $musor ]
then
rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info
else
fi && exit

Пояснения.

musor=~/.local/share/Trash/info устанавливает имя каталога, существование которого будет проверяться командой if [ -d $musor ].

Если такой каталог существует то тогда будет выполнена команда удаления каталогов files и info вместе с их содержимым:

then
rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info

Пояснение. При первой же операции удаления в Корзину данные каталоги будут вновь автоматически созданы системой.

Если такого каталога нет, то скрипт будет считать, что работы для него нет и завершит свою работу.

Примечание. В данном примере не рассматривается каталог expunged, который также присутствует в каталоге ~/.local/share/Trash. Как следует из его назначения, в него помещается контент, который был удалён, но по каким-то причинам полного удаления его произведено не было. Однако за 8 лет работы в Linux мне ни разу не пришлось столкнуться с тем, чтобы в этот каталог было бы что-нибудь помещено. Но если Вас волнует эта проблема, то его можно добавить в команду очистки Корзины, а затем создать его снова:

rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info ~/.local/share/Trash/expunged
mkdir ~/.local/share/Trash/expunged

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

zenity --info --text "Текст сообщения." 2>/dev/null --timeout=5

или

notify-send -i info "Текст сообщения."

В первом случае будет выведено информационное окно по центру экрана,


а во втором – так называемое оповещение, которое в зависимости от настроек будет отображено в правом верхнем/нижнем или левом верхнем/нижнем углу экрана монитора.


При использовании таких уведомлений текст скрипта может быть дополнен. Примеры:

#!/bin/bash
# Очистка Корзины по условию
musor=~/.local/share/Trash/info
if [ -d $musor ]
then
rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info
zenity --info --text "Корзина очищена." 2>/dev/null --timeout=5
else
zenity --info --text "Корзину чистить не нужно." 2>/dev/null --timeout=5
fi && exit

#!/bin/bash
# Очистка Корзины по условию
musor=~/.local/share/Trash/info
if [ -d $musor ]
then
rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info
notify-send -i info "Корзина очищена."
else
notify-send -i info "Корзину чистить не нужно."
fi && exit

Созданный скрипт можно запускать вручную (создав соответствующую кнопку запуска) или пользовательским заданием cron по расписанию.

Лично у меня скрипт некоторое время использовался при выключении компьютера (создана специальная кнопка выключения компьютера). По-моему мнению, удалённый в Корзину контент необходим только как страховка в случае случайного удаления данных. А это выясняется до завершения работы на компьютере. Поэтому текст применявшегося мной скрипта выглядит следующим образом:

#!/bin/bash
# Очистка Корзины по условию
musor=~/.local/share/Trash/info
if [ -d $musor ]
then
rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info
notify-send -i info "Корзина очищена."
else
notify-send -i info "Корзину чистить не нужно."
fi
sleep 10
zenity --info --text "Запуск задания на выключение." 2>/dev/null --timeout=5
shutdown

Введение команды sleep 10 обусловлено тем, что необходимо обеспечить последовательное отображение двух информационных сообщений. В данном примере настройка уведомления notify-send -i info предусматривает отображение сообщения в течение 7 секунд.

Команда shutdown запускает процесс собственно выключения компьютера, которое произойдёт через 60 секунд. Если необходимо немедленное выключение, то используйте команду shutdown -h now и без строки zenity --info --text ...

Удалить из корзины файлы и каталоги старше N дней

Задача может быть решена установкой пакетов autotrash или trash-cli.

Autotrash

Пакет autotrash можно установить через Synaptic, для нахождения которого задать в строке поиска trash или autotrash,


либо выполнив в терминале команду sudo apt install autotrash

Исполняемый файл расположен в каталоге /usr/bin и представляет из себя последовательность команд, написанных на языке Python:


Синтаксис команды определяется вызовом в терминале справки: autotrash -h

Для удаления из Корзины объектов (файлы и каталоги) старше N дней применяется команда – autotrash -d N. Например, для 3 дней – autotrash -d 3

Данную команду можно оформить исполняемым файлом (скриптом):

#!bin/bash
autotrash -d 3
exit

Скрипт можно запускать вручную, создав для него кнопку запуска, при загрузке системы или создать пользовательское задание cron, которое будет выполнять очистку Корзины по расписанию.

Если у Вас имеются дополнительные смонтированные разделы (диски), то для очистки Корзины в них с помощью ПО autotrash необходимо указать путь к Корзине на них, так как по умолчанию ПО полагает, что Корзина расположена по пути ~/.local/share/Trash (~/ соответствует Вашему домашнему каталогу).

В соответствии с инструкцией по применению (autotrash --help), в этом случае полная команда должна быть примерно такой:

#!bin/bash
autotrash -d 3
autotrash -T /home/user/R-1/.Trash-1000 -d 3
exit

Параметр -T задаёт пусть к Корзине дополнительного раздела с точкой монтирования R-1. Если Вы являетесь первым пользователем системы, то Вам назначен id 1000, Ваша Корзина на другом разделе является скрытым каталогом .Trash-1000. Корзина следующего пользователя будет являться скрытым каталогом .Trash-1001 и т.д.

Autotrash может применяться и с другими условиями:

--max-free=M – произвести очистку Корзины, если свободное место на разделе меньше M мегабайт. Например, 4 Гб = 4096 Мб;

--min-free=M – произвести очистку Корзины, если на разделе осталось доступно M мегабайт.

Примечание. Следует отметить, что в Linux имеется разница между "свободно" и "доступно". Свободно – это действительно то место, которое ещё не занято какими-либо данными. Доступно – это место, в которое Вы можете записывать данные. По умолчанию, разница между ними составляет 5% от объёма дискового пространства раздела. Условно можно сказать, что Доступно = Свободно - 5%. Пять процентов дискового пространства резервируется для нужд системы на случай "ремонта" файловой системы (например, перестройка индексов) или дефрагментации. На больших разделах (например, 1-2 Тб) это значение можно менять, уменьшая его до 1-2 % с помощью утилиты tune2fs.

--delete=M – произвести очистку Корзины, удалив из неё объекты меньше M мегабайт.

Команда очистки Корзины может быть комбинированной, например,
   autotrash --min-free 10240 -d 10

Trash-cli (утилита командной строки)

Пакет trash-cli можно установить через Synaptic, для нахождения которого задать в строке поиска trash или trash-cli,


либо выполнив в терминале команду sudo apt install trash-cli

Удаление из Корзины объектов старше N дней производится командой
   trash-empty N

Например, удалить объекты старше 3 дней – trash-empty 3 или скриптом

#!bin/bash
trash-empty 3
exit

Другими доступными командами для работы с trash-cli являются:

trash-list – отобразить объекты в Корзине,
trash-empty – очистить Корзину,
restore-trash – восстановить из Корзины,
trash-put  – действие, аналогичное rm, но с возможностью просмотра списка "удалённого". В реальности, объекты будут перемещены в Корзину с возможностью их просмотра по команде trash-list.

Примечание.

Последнее позволяет сопоставить команду rm перемещению в Корзину, для чего в скрытом файле ~/.bashrc необходимо создать алиас (псевдоним), вписав строку
    alias rm=trash-put или alias rm='trash'.
Если это сделать и для суперпользователя (файл /root/.bashrc), то все удалённые от его имени объекты будут помещаться в Корзину суперпользователя, которую затем тоже необходимо будет очищать.

Иными возможными вариантами так называемого "безопасного удаления" являются:

а) применение скрипта saferm.sh
Скрипт помещается в /bin и для него создаётся алиас alias rm=saferm.sh ;

б) применение скрипта move_to_trash.sh – #!/bin/sh mv "$@" ~/.trash
Создаётся алиас alias rm=путь к скрипту/move_to_trash.sh   (источник)