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

среда, 28 августа 2024 г.

Автоматизация действий с файлами при использовании Syncthing

При использовании Syncthing можно организовать автоматическое раскладывание полученных файлов/папок из папки обмена в нужные папки. Операция производится через запуск скрипта sh, выполняемого по расписанию.

Подсчитывается количество файлов в папке источника $source (путь к папке задаётся в переменных скрипта, например, source=/home/minter/Документы/Exchange). Подсчёт производится без учёта вложенных папок папки источника, то есть из него исключаются папки .stfolder и .stversions. Также из подсчёта исключаются файлы, загрузка которых ещё не завершена и которые будут иметь расширение .tmp  Если результат подсчёта равен 0, то ничего не предпринимается. В противном случае выполняются какие-то действия.

#!/bin/bash
count=`find $source -maxdepth 1 -type f ! -name "*.tmp" | wc -l`
if [ $count -eq 0 ]; then
    :
  else
    перечисление действий или выполняемые скрипты sh
fi
exit

Например, перенести файлы jpg и mp4 в нужные папки $dest1 или $dest2. Подсчёт нужных файлов производится по их расширениям:

Для файлов jpg:

cjpg=`find $source -maxdepth 1 -name "*.jpg" | wc -l`
if [ $cjpg -eq 0 ]; then
      :
  else
      mv $source/*.jpg $dest1
fi

Для файлов mp4:

cmp4=`find $source -maxdepth 1 -name "*.mp4" | wc -l`
if [ $cmp4 -eq 0 ]; then
      :
  else
      mv $source/*.mp4 $dest2
fi 

Для переноса папок вопрос усложняется, так как необходимо учесть множество условий. Задача становится более простой, если передаваемая папка будет упакована в какой-либо архив: tar, zip. 7z  Если при подсчёте файлов будут найдены файлы с расширениями tar, zip, 7z, то будет запущена задача извлечения данных из таких архивов в папку назначения (например, $dest), а исходные файлы могут быть либо удалены начисто, либо перемещены в Корзину. Примеры ниже.

Файлы архивов tar

ctar=`find $source -name "*.tar" | wc -l`
if [ $ctar -eq 0 ]; then
    :
  else
    for package in $dest/*.tar;
    do
    tar -xf "$package" -C $dest
    done
    # указать одно из двух
    rm $source/*.tar  # удалить начисто
    gio trash $source/*.tar  # удалить в Корзину
fi

Файлы архивов tar.gz

ctargz=`find $source -name "*.tar.gz" | wc -l`
if [ $ctargz -eq 0 ]; then
    :
  else
    for package in $dest/*.tar.gz;
    do
    tar -xzf "$package" -C $dest
    done
    # указать одно из двух
    rm $source/*.tar.gz  # удалить начисто
    gio trash $source/*.tar.gz  # удалить в Корзину
fi

Файлы архивов zip

czip=`find $dest -name "*.zip" | wc -l`
if [ $czip -eq 0 ]; then
    :
  else
   for package in $dest/*.zip;
   do
   unzip -d $dest "$package"
   done
    # указать одно из двух
    rm $source/*.zip  # удалить начисто
    gio trash $source/*.zip  # удалить в Корзину
fi

Файлы архивов 7z

c7zsp=`find $source -name "*.7z" | wc -l`

if [ $c7z -eq 0 ];
  then
    :
  else
    for package in $source/*.7z;
    do
    7z x "$package" -o$dest
    done
    # указать одно из двух
    rm $source/*.7z  # удалить начисто
    gio trash $source/*.7z  # удалить в Корзину
fi

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

7z x -pпароль "$package" -o$dest

Такие архивы можно помечать дополнительной буквой, например s, добавляемой к концу имени файла. Тогда вместо *.7z нужно будет указать *s.7z

пятница, 15 марта 2024 г.

Запланировать выключение компьютера через графическую форму

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


Указанное на рисунке выше третье значение +155 является результатом сложения чисел 60, 60, 35. То есть, оно является указанием значения в минутах ( для тех, кто не понял 😊 ).

Понятно, что после ввода в строку значения и последующего нажатия кнопки OK будет запланировано выключение компьютера "в" или "через". Если ничего не вводить и нажать ОК или нажать Отмена (пользователь передумал), или просто закрыть окно формы, то компьютер выключится через 1 минуту, так как будет выполнена команда shutdown без указания параметров. Но этого можно избежать, если после завершения работы формы будет произведена проверка на наличие введённого значения, то есть, чтобы файл не был пустым, например:


Собственно сам скрипт (исполняемый файл):

#!/bin/bash
zenity --width=220 --title "Когда выключить" --text="Ввод в формате xx:yy или + x\nПримеры ввода:\n23:59  = в 23 часа 59 минут.\n+15      = через 15 минут.\n+155   = через 2 часа 35 минут." --entry > /tmp/down.txt
if [[ ! -z $(cat /tmp/down.txt) ]] ; then
    shutdown $(cat /tmp/down.txt) &
  else
    zenity --width=150 --height=50 --info --timeout=5 --title="Уведомление" --text="Не указано время\nвыключения.\nЗадание не назначено."
fi
exit

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

--width= и --height= определяют ширину и высоту форм.

--timeout=5 указывает на интервал в 5 секунд, после которого форма уведомления автоматически будет закрыта. Если это не востребовано, то используйте:

#!/bin/bash
zenity --width=220 --title "Когда выключить" --text="Ввод в формате xx:yy или + x\nПримеры ввода:\n23:59  = в 23 часа 59 минут.\n+15      = через 15 минут.\n+155   = через 2 часа 35 минут." --entry > /tmp/down.txt
if [ -s /tmp/down.txt ]; then
    shutdown $(cat /tmp/down.txt) &
  else
    :
fi
exit

или так:

#!/bin/bash
zenity --width=220 --title "Когда выключить" --text="Ввод в формате xx:yy или + x\nПримеры ввода:\n23:59  = в 23 часа 59 минут.\n+15      = через 15 минут.\n+155   = через 2 часа 35 минут." --entry > /tmp/down.txt
if [[ ! -z $(cat /tmp/down.txt) ]] ; then
    shutdown $(cat /tmp/down.txt) &
fi
exit

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

✅    Добавление подтверждающих сообщений

Результат ввода значений можно отобразить информационным сообщением. Примеры:



Чтобы отображалось нужное сообщение, поскольку ввод может быть как в формате ЧЧ:ММ (часов минут), так и в формате +М (минут), то в скрипт вводится проверка введённого значения на наличие символа двоеточия (или +, но тогда следует поменять местами порядок выполнения по условию).

var=`cat /tmp/down.txt`
if [[ $var =~ ":" ]]; then
    zenity --width=150 --height=50 --info --timeout=7 --title="Подтверждение" --text="Компьютер будет\nвыключен в $(cat /tmp/down.txt)"
  else
    zenity --width=150 --height=50 --info --timeout=7 --title="Подтверждение" --text="Компьютер будет\nвыключен\n через $(cut -c2- <<< $(cat /tmp/down.txt)) мин."
fi

Если в считанном значении будет найден символ двоеточия, то результатом будет вывод сообщения о выключении ЧЧ:ММ. В ином случае будет выводиться сообщение о выключении через М минут. При выводе второго сообщения не отображается символ +, что обеспечивается инструкцией $(cut -c2- <<< $(cat /tmp/down.txt)). --timeout=7 указывает, что после 7 секунд выводимое сообщение автоматически исчезнет. Таким образом, листинг скрипта с информационными сообщениями имеет вид: 

#!/bin/bash
zenity --width=220 --title "Когда выключить" --text="Ввод в формате xx:yy или + x\nПримеры ввода:\n23:59  = в 23 часа 59 минут.\n+15      = через 15 минут.\n+155   = через 2 часа 35 минут." --entry > /tmp/down.txt
if [[ ! -z $(cat /tmp/down.txt) ]] ; then
    shutdown $(cat /tmp/down.txt) &
      var=`cat /tmp/down.txt`
      if [[ $var =~ ":" ]]; then
            zenity --width=150 --height=50 --info --timeout=7 --title="Уведомление" --text="Компьютер будет\nвыключен в $(cat /tmp/down.txt)"
         else
           zenity --width=150 --height=50 --info --timeout=7 --title="Уведомление" --text="Компьютер будет\nвыключен\n через $(cut -c2- <<< $(cat /tmp/down.txt)) мин."
      fi
  else
    zenity --width=150 --height=50 --info --timeout=5 --title="Уведомление" --text="Не указано время\nвыключения.\nЗадание не назначено."
fi
exit

✅   Чтобы сделать кнопку вызова созданного скрипта в главном меню создайте файл .desktop, например, Shutdown-at.dеsktop, который должен располагаться в скрытой папке вашего домашнего каталога (папки) ~/.local/share/applications и впишите в него:

[Desktop Entry]
Name=Shutdown-at
Exec=полный путь к файлу sh
Comment=Назначить время выключения
Terminal=false
PrefersNonDefaultGPU=false
Icon=укажите значок для кнопки, например, application-exit или system-shutdown
Type=Application
Categories=GTK;Development;

Если нужно, чтобы кнопка отображалась по-русски, то добавьте строку Name[ru]= , в которой укажите свой текст.

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

Демонстрационный ролик (ниже или на Google Drive):

понедельник, 27 ноября 2023 г.

Перекодировать flac в mp3

На днях возникла необходимость перекодировать большое число файлов flac в формат mp3. Как всегда, в извечном споре "сделать самому или найти того кто сделает" победила природная лень 😁. Потому что сразу были предприняты поиски в Интернет насчёт необходимых команд в терминале. А поскольку было желание организовать всё так как описано в этой публикации, то возникло стремление получить аналогичное решение вопроса.  

Создаётся сценарий sh и кнопка запуска, указывающая на созданный сценарий. 

Сценарий (скрипт sh)

#!/bin/bash
dir=$(zenity --file-selection --directory)
find "$dir" -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 320k {}.mp3 \;
find "$dir" -name "*.flac" -exec rm {} \;
find "$dir" -name '*.flac.mp3' -exec sh -c 'mv "$0" "${0%.flac.mp3}.mp3"' {} \;

Что он делает:
1. Запрашивает папку расположения файлов flac.
2. В указанной папке рекурсивно перекодирует файлы flac в файлы формата mp3 с указанным битрейтом. В данном примере битрейт указан как 320k. Укажите желаемую вами степень сжатия (например, 196k).
3. Удаляются все исходные файлы с раcширением flac
4. Поскольку перекодированные в формат mp3 файлы имеют расширение flac.mp3, то осуществляется переименование их расширения в mp3

Кнопка запуска представляет собой файл вида .desktop (пример создания здесь). 

Пример содержания файла .desktop кнопки запуска:
[Desktop Entry]
Version=1.0
Type=Application
Name=flac-mp3
Comment=
Exec=/home/minter/Tools/scripts/modules/flac-mp3.sh
Icon=audio-x-flac
Path=
Terminal=true
StartupNotify=false

После создания кнопки запуска переместите её с рабочего стола в папку своего профиля ~/.local/share/applications  После этого созданная кнопка запуска будет отображаться в главном меню в разделе "Прочее", "Разное" или ей подобной (зависит от дистрибутива). Если есть необходимость её отображения в разделе "Мультимедиа", то откройте созданную вами кнопку в текстовом редакторе, например,

xed /home/ваш_профиль/.local/share/applications/ваша_кнопка.desktop

в впишите в него строку  Categories=AudioVideo;Audio;

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

суббота, 25 ноября 2023 г.

Запросы пользователю на монтирование дисков в папки его профиля

Про автоматическое монтирование дисков при старте системы имеется достаточное количество материалов. Но в большинстве случаев такие решения сводятся к внесению изменений в файл /etc/fstab. У меня же возникла необходимость выдачи запроса на монтирование дисков. При положительном ответе "да" диски будут смонтированы, при отрицательном "нет" монтирование производится не будет. 

Обусловлено личными потребностями, так как упоминаемые диски могут быть временно изъяты из компьютера и при обычном автомонтировании через /etc/fstab система будет на некоторое время сильно задумываться, пока не сообразит, что упоминаемых дисков не имеется и загрузка может быть продолжена.

Для удобства целесообразно создать стартовый сценарий, например, start.sh, который будет автоматически выполняться при каждом входе пользователя в систему. То есть, создать файл и установить его в автозагрузку. В Linux xfce это настраивается в Система/Сеансы и запуск, а в Cinnamon – Параметры/Автозагрузка. 

 #!/bin/bash
...
...
exit

Создаются 2 файла sh, которые собственно и командуют монтирование дисков. При этом каждый диск у меня идетифицируется не как /dev/sd... , а по своему uuid. Связано с тем, что при обратной установке шлейфы могут быть воткнуты не туда где были раньше, то есть порядок определения дисков по /dev/sd... может быть перепутан. А так как мои диски монтируются в папки AG-2 и AN-2 моего домашнего каталога, то не хочется быть удивлённым тому, что содержание данных папок потом будет не таким, как было раньше. uuid дисков определяется через команду 

sudo blkid

Для 1-го диска файл  mount-g2.sh

#!/bin/bash
mount --uuid="c57e4566-84ed-4d54-8cd4-1e0eaeac5b4e" /home/minter/AG-2 &
exit

Для второго диска файл mount-n2.sh

#!/bin/bash
mount --uuid="b72b0384-9782-4eaf-9606-ca48469ef6da" /home/minter/AN-2 &
exit

Поскольку монтирование осуществляется через sudo, то имеет смысл внести в файл /etc/sudoers записи, в соответствии с которыми пароль для sudo запрашиваться не будет.

sudo xed /etc/sudoers и внести строки (пример):

minter ALL=NOPASSWD: /home/minter/Tools/scripts/modules/mount-g2.sh
minter ALL=NOPASSWD: /home/minter/Tools/scripts/modules/mount-n2.sh

minter – это мой логин в системе.

Создаются 2 файла запросов на монтирование каждого из дисков. Пример приводится для 1-го диска (для второго будет аналогично):

#!/bin/bash
log=/home/minter/Документы/Reports/$(date '+%d').txt
zenity --width=150 --height=50 --question --timeout=10 --title="Запрос" --text="\nМонтировать G-2? \n$task" \
--ok-label="Нет" \
--cancel-label="Да"
answer=$?
if [ "$answer" -eq 0 ]; then
    :
    echo "$(date '+%H.%M.%S') – G-2 not mounted" >> $log
    echo "0" >> /tmp/mount1.txt
elif [ "$answer" -eq 1 ]; then
    sudo /home/minter/Tools/scripts/modules/mount-g2.sh
    echo "$(date '+%H.%M.%S') – G-2 mounted" >> $log
    echo "1" >> /tmp/mount1.txt
elif [ "$answer" -eq 5 ]; then
    sudo /home/minter/Tools/scripts/modules/mount-g2.sh
    echo "$(date '+%H.%M.%S') – G-2 mounted" >> $log
    echo "1" >> /tmp/mount1.txt
fi
exit 0

Если не нужно вести протокола и записывать результат "смонтировано" или "не смонтировано" в файлы /tmp/mount...txt, то строку log= и начинаются с echo  строки можно удалить. Мне они нужны для протоколирования отработки стартового сценария в целом, а также процедур по автоматической очистке Корзин на монтируемых дисках с удалением из них всех объектов (папки и файлы) старше 3 суток.

При появлении окна запроса система ожидает решения пользователя 10 секунд. Если за это время ничего не было выбрано, то система будет считать, что пользователь выбрал "Да", то есть монтировать и, соответственно перейдёт к команде монтирования диска, то есть

sudo /home/minter/Tools/scripts/modules/mount-g2.sh

Если выбрано "Нет", то монтирование диска не производится.

В start.sh вносятся команды с запросами монтирования с интервалом между ними 5 секунд и 5-секундным интервалом после запроса на монтирование 2-го диска. Интервал в 5 секунд необходим для того, чтобы окно запроса на монтирование 2-го диска не перекрывало окно запроса на монтирование 1-го диска. Вспомним, что система ожидает решения пользователя 10 секунд.

sleep 5
$do/modules/querry-mount-g2.sh
sleep 5
$do/modules/querry-mount-n2.sh
sleep 5

И, собственно, результат:


воскресенье, 30 июля 2023 г.

Найти в папке все файлы sh и сделать их исполняемыми

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

Проблема была решена выполнением команды, которая ищет по указанному пути все файлы sh и делает их исполняемыми:

find /home/minter/Tools/scripts -name "*.sh" -exec chmod u+x {} \;

Вместо  /home/minter/Tools/scripts укажите нужный вам путь к папке с файлами sh.

четверг, 20 июля 2023 г.

Кнопка запуска (лаунчер) для запланированного выключения Linux Mint

Как указано в различных публикациях на тему запланированного выключения Linux, для этого необходимо выполнить в терминале одну из команд: 

shutdown часов:минут для выключения в определённое время, например, 22:59 – shutdown 22:59;

shutdown +40 для выключения через 40 минут.

✅  Примечание. Обычно приводится команда shutdown -h часов:минут, но, как показала практика, достаточно команды shutdown часов:минут.

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

Сначала создаётся скрипт (сценарий), который будет вызывать кнопка запуска, а затем создаётся сама кнопка запуска.

1. Скрипт (сценарий) представляет из себя файл текста (с расширением sh или без него), в свойствах которого (Права) указано, что его разрешено выполнять как программу.

#!/bin/bash
zenity --width=220 --title "Когда выключить" --text="Ввод в формате, например,\n в часов:минут – 23:59 или\n через 15 минут – +15\nНичего не вводить или\nОтменить – через 1 минуту\n" --entry > /tmp/down.txt
shutdown $(cat /tmp/down.txt) &
exit

Выполняется запрос ввода времени когда или через сколько необходимо выключить компьютер. Введённое значение записывается во временный файл, например, /tmp/down.txt :

zenity --width=220 --title "Когда выключить" --text="Ввод в формате, например,\n в часов:минут – 23:59 или\n через 15 минут – +15\nНичего не вводить или\nОтменить – через 1 минуту\n" --entry > /tmp/down.txt

Значение --width=220 указывает на ширину окна формы запроса. Изменяя значение после знака = можно отрегулировать желаемую ширину окна формы запроса.

Символы \n указывают переходы на следующую строку.

shutdown $(cat /tmp/down.txt) & соответствует выполнению команды shutdown и значения, которое считывается из сохранённого файла /tmp/down.txt, после чего выполнение самого скрипта (сценария) завершается. Символ & означает переход к выполнению следующей команды, не дожидаясь завершения выполнения предыдущей.

Как это выглядит:


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

zenity --width=220 --title "Когда выключить" --entry > /tmp/down.txt

2. Кнопка запуска (лаунчер) создаётся на рабочем столе через правое контекстное меню мыши. Примеры для Cinnamon и xfce смотрите по ссылкам: Cinnamonxfce. Указывать выполнение команды в терминале не требуется.

При создании кнопки запуска она по умолчанию создаётся на рабочем столе и в меню в категории "Разное". После создания кнопки запуска её с рабочего стола можно удалить (для поддержания его в чистоте 😀).

Если в категории "Разное" у вас имеется слишком много созданных кнопок запуска, то кнопку запуска запланированного выключения можно поместить в категорию "Программирование". Для этого откройте в менеджере файлов папку (каталог) своей домашней папки ~/.local/share/applications , найдите в ней свой созданный файл .desktop (в Cinnamon расширение .desktop отображаться не будет, будут отображены только названия файлов) и откройте его в текстовом редакторе. В конец файла добавьте строку 

Categories=GTK;Development;

и сохраните его. После этого ваша кнопка будет отображаться в категории "Программирование" (Cinnamon) или "Разработка" (xfce).

Протестируйте работу, указывая различные варианты запланированного времени выключения.

🔔  Будьте внимательны при вызове созданной кнопки запуска. Если вы даже ничего не вводили или нажали кнопку "Отменить", то у вас уже передана команда shutdown. Команда shutdown без аргументов соответствует команде выключения компьютера через 60 секунд.

При необходимости подбора ширины окна формы запроса времени выключения вводите в терминале команду: 

zenity --width=220 --title "Когда выключить" --text="Ввод в формате, например,\n в часов:минут – 23:59 или\n через 15 минут – +15\nНичего не вводить или\nОтменить – через 1 минуту\n" --entry > /tmp/down.txt

При этом передачи системе команды shutdown произведено не будет.

пятница, 12 мая 2023 г.

Пакетное переименование расширения файлов JPG в jpg

При использовании 4K Slideshow Maker на Linux Mint было обнаружено, что при добавлении в слайшоу файлов изображений с расширением JPG в списке добавленных программа этих файлов не видит и, соответственно, не обрабатывает. Такое расширение файлов JPG необходимо переименовывать в jpg.

Для своих нужд написан маленький сценарий, при запуске которого выбирается каталог (папка), в котором необходимо произвести замену расширений JPG на jpg.

#!/bin/bash
dir=$(zenity --file-selection --directory)
find "$dir" -name '*.JPG' -exec sh -c 'mv "$0" "${0%.JPG}.jpg"' {} \;
exit

Сценарий можно оформить как кнопку запуска приложений. Кнопка запуска приложений представляет из себя обычный текстовый файл с расширением .desktop. который размещается в скрытом каталоге домашнего каталога пользователя ~/.local/share/applications и имеет права на выполнение (в качестве программы).

[Desktop Entry]
Version=1.0
Type=Application
Name=Переименовать JPG в jpg
Comment=
Exec=/home/minter/Tools/scripts/modules/rename-nemo-JPG-to-jpg.sh
Icon=emblem-cozy-drive-1
Path=
Terminal=false
StartupNotify=false

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

Если необходимо чтобы сценарий был запущен в терминале, то измените Terminal=false на Terminal=true

При указанном выше листинге файла desktop кнопка запуска "Переименовать JPG в jpg" будет расположена в категории "Прочее". Чтобы эта кнопка запуска отобразилась в категории "Графика" добавьте в конец файла строку Categories=Graphics;

суббота, 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. У вас оно будет своё.

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

Внесение в cron нескольких заданий через bash

Возникла необходимость внесения двух заданий в в cron. Например, одно задание должно выполняться ежедневно каждую 1 минуту часа с 18 до 21 часов, а второе задание также должно выполняться ежедневно, но в 21 час. 5 минут.

Если компьютер свой, то назначить эти задания можно через команду терминала crontab -e (см. пользовательское задание cron):

01 18-21 * * * /home/minter/.config/scripts/cron1.sh

05 21 * * * /home/minter/.config/scripts/cron2.sh

Но если компьютер не свой (вы кому-то помогаете дистанционно) или каждый раз просто лень постоянно вносить изменения в сron через  crontab -e ?

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

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

🔰   Примечание. Приём заимствован из арсенала администраторов Linux, но с успехом работает и в системе только с одним пользователем. 

Пример:

#!/bin/bash
crontab -r
crontab -u minter /home/minter/Shared/cronjob
exit

-u minter  указывает на то, что новый cron будет назначен для пользователя системы с логином minter. Если пользователь имеет логин user, то будет -u user

/home/minter/Shared/cronjob  указывает полный путь к файлу cronjob

Сохраните данный скрипт как исполняемый файл sh, например newcron.sh 

Файл cronjob (или любое другое имя) представляет из себя обычный текстовый файл. Пример:

#
01 18-21 * * * /home/minter/.config/scripts/cron1.sh
05 21 * * * /home/minter/.config/scripts/cron2.sh

Обратите внимание, что в данном текстовом файле нет необходимости делать перевод каретки на новую строку, как это предписано при редактировании через crontab -e

Попробуйте выполнить созданный скрипт.  Откройте на редактирование cron (crontab -e) и убедитесь, что синтакис cron соблюдён, то есть пустая строка в конце присутствует.

вторник, 15 марта 2022 г.

Поиск Яндекс в Firefox

На днях в просматриваемом мной форуме было сообщение, в котором один из участников "пожаловался", что из браузера Firefox пропал поиск через Яндекс.

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

В целом, можно сказать, попытка увенчалась успехом, хотя и было найдено немного не то. Но после некоторого скрипения серым веществом найденное было переработано в свой сценарий (скрипт). Сценарий оформляется как исполняемый файл sh, который можно запустить как по кнопке (значку) запуска, так и через назначаемую в настройках клавиатуры комбинацию клавиш, в качестве команды которой прописывается 
sh -c полный_путь_к_скрипту, например 
sh -c /home/user/yandex.sh

Для функционирования скрипта требуется наличие в системе установленных zenity и xclip. Если насчёт отсутствия zenity утверждать не берусь, то xclip по умолчанию в системе отсутствует. Что, впрочем, легко исправляется:

sudo apt install zenity  и  sudo apt install xclip

Нужный код был честно ©пёрт отсюда. В процессе редактирования было "выброшено" лишнее и оставлено только то, что относится к поиску в Яндекс.

Как это выглядит:


После ввода текста и нажатия кнопки ОК откроется новая вкладка браузера Firefox с выводом результатов поискового запроса. Если ничего не вводить и нажать "Отменить", но новое окно Firefox запущено не будет.

Бонус  скрипта заключается в том, что если будет выделен какой либо текст (слово) и далее запущен скрипт, то выделенное автоматически подставляется в поле ввода текста для поиска.

Текст скрипта:

#!/bin/bash
out="/tmp/poisk.$$"
zenity --width=350 --title  "Поиск в Яндекс" --text "Введите текст для поиска" --entry --entry-text="$(xclip -o)" > "$out"
if [ $? -eq 0 -a "`cat "$out"`" != "" ]
then
url="https://www.yandex.ru/yandsearch?text=`cat "$out"`"
firefox -new-tab "$url" &
fi
rm "$out"
exit

   P.S. Скрипт можно запускать и с другим браузером. Для этого нужно только изменить команду firefox. При этом если другой браузер не используется как основной, то для предотвращения вопроса "а не желаете ли его назначить браузером по умолчанию" в параметрах запуска можно установить  -no-default-browser-check.

Примеры:

Waterfox – /opt/waterfox/waterfox -no-default-browser-check

LibreWolf – /usr/share/librewolf/librewolf -no-default-browser-check

Palemoon – /usr/bin/palemoon -no-default-browser-check

Opera – /usr/bin/opera -no-default-browser-check

Slimjet – /usr/bin/flashpeak-slimjet -no-default-browser-check

Vivaldi – /usr/bin/vivaldi-stable -no-default-browser-check

Brave – /opt/brave.com/brave/brave -no-default-browser-check

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

Определить запущен ли Transmission через bash

При написании сценария возникла проблема определения: работает ли клиент торрент Transmission. Быстрая команда pidof Transmission результата не выдает, несмотря на то, что в списке процессов данный процесс присутствует:

Как показало следствие, правильно процесс называется transmission-gtk. И тогда при такой инструкции:

[ "$(pidof transmission-gtk)" ] && echo "1" > /tmp/transmission.txt || echo "0" > /tmp/transmission.txt

при запущенном Transmission в файл transmission.txt будет записано значение 1, а при не запущенном – 0.

Магия, однако ...  😎 

понедельник, 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.



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

четверг, 20 января 2022 г.

Выполнение действий по условию – если число файлов больше 10


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

Реализацию данной задачи было решено возложить на скрипт bash, запускаемый через пользовательское задание cron.

Указанный ниже скрипт на bash действует по алгоритму:

1. Вычисляется число файлов в папке для отправки.

2. Полученное значение сравнивается с установленным значением 10.

3. Если в результате сравнения будет выяснено, что число файлов в папке для отправки больше 10, то запускается задание на отправку. Если выяснено, что число файлов 10 и менее, то задание на отправку не запускается. Отправка производится программой rclone.

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

if [ $value2 -qt $value1 ]; then

здесь не работает, а работает

if (( $value2 > $value1 )); then

Поэтому текст скрипта будет следующим:

#!/bin/bash
log=место_файла_протокола/$(date '+%d').имя_файла.txt
sm=... # указывается путь к папке отправки
dm=... # указывается путь к папке получателя
# если файл протокола отсутствует, то он создаётся
if [ -f $log ]; then
  :
else
  > $log
fi
echo "     " >> $log
find $sm -type f | wc -l > /tmp/files.txt
value1=10
value2=`cat /tmp/files.txt`
if (( $value2 > $value1 )); then
     echo "$(date '+%H.%M.%S') -- файлов в папке – $value2" >> $log
     # запуск задания на отправку файлов и папок с файлами через команду перемещения
     echo "            запуск задания отправки" >> $log 
     rclone move --delete-empty-src-dirs $sm $dm
     echo "$(date '+%H.%M.%S') -- завершение задания отправки" >> $log
  else
     echo "$(date '+%H.%M.%S') -- отправка не произведена" >> $log
     echo "            файлов в папке – $value2" >> $log
fi
echo "     " >> $log
exit

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

🔰  Дополнительные пояснения. Число пробелов с строках записи в протокол событий составляет 12, что объясняется желанием удобства чтения протокола, то есть помещать следующую запись текста прямо под предыдущей, например:

17.30.01 -- файлов в папке – 11
                   запуск задания отправки
17.31.19 -- завершение задания отправки

Для автоматического удаления удаления устаревших файлов протоколов можно использовать команду:

find место_файлов_протоколов -name "*.txt" -mtime +N -delete

N является числом полных суток, например 3. То есть, если с момента создания файла протокола прошло 72 часа и менее, то файл не удаляется, а вот если прошло 72 часа 1 минута и более, то файл уже подлежит удалению. Подробности можно прочитать здесь в комментариях 5 и 6.

пятница, 10 сентября 2021 г.

Адаптер wifi usb теряет связь с роутером по случайному закону

Проблема возникла при использовании на Linux подключаемого по usb wifi адаптера Realtek r8188eu (производства КНР) и роутера MikroTik 931-2nD r2. Сначала под подозрением оказался сам роутер MikroTik. Впоследствии выяснилось, что он "не виновен". Далее под подозрение попало устройство Realtek r8188eu в привязке именно к рассматриваемому компьютеру. Аналогичные r8188eu, подключаемые к другим компьютерам Windows и Linux, "вели себя" штатно.

Внешнее проявление выражалось в пропадании в какой-то момент времени связи с Интернет. При этом сам значок сетевого соединения на панели наличие соединения по wifi показывал, информация об IP-адресе и скорости соединения с точкой wifi присутствовала. Но команда ping роутера приводила к отрицательному результату, хотя ping своего IP-адреса,  полученного от DHCP роутера, выдавал положительный ответ. 

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

Было обнаружено, что если через значок менеджера сетевых соединений выключить и затем снова включить либо поддержку сети, либо Wi-Fi, связь компьютера с роутером восстанавливается.

Может быть сам r8188eu оказался немного дефектным, может быть он не совсем "дружит" с конкретным железом, может быть требуется осуществить ряд тонких настроек точки wifi роутера – это вопросы теоретических изысканий и долгого разбирательства. А причин может быть, как говорят, воз и маленькая тележка. Поэтому было принято решение оттолкнуться от результата выключения/включения поддержки сети и сделать такие действия выполняемыми автоматически при условии пропадания соединения с роутером. 

✔  Примечание. Решение было создано для своих нужд и не претендует как на корректность реализации, так и на изящность кода команд на bash.

Проверка состояния "видимости" роутера

✔  Примечание. Так как для запуска инструмента управления роутером MikroTik – winbox – в Linux требуется установка дополнительного ПО wine, то для управления роутером используется доступ через браузер и на MikroTik запущена служба www, хотя из соображений безопасности её не всегда рекомендуется использовать. Однако поскольку доступ к роутеру по www ограничен конкретной сетью (192.168.190.0/28), то её включение на MikroTik было сочтено приемлемым.

Сам роутер через DHCP выдаёт домен vot и в DNS имеет запись router.vot  Поэтому был создан сценарий, запускаемый через cron каждые 20 минут, который при отсутствии ответа от узла router.vot выполняет какое-то действие:

#!/bin/bash
echo -e "GET http://router.vot HTTP/1.0\n\n" | nc router.vot 80 > /dev/null 2>&1
if [ $? -eq 0 ]; then
     :
  else
     действие
fi
exit

Для внесения в cron задания выполните в терминале команду 

crontab -e

впишите новую строку

*/20 * * * * путь к сценарию sh

осуществите перевод каретки на новую строку и сохраните внесённые изменения.

✔  Примечание.  Если сценарий дополнить записью результата проверки в протокол, то получится, например:

#!/bin/bash
day=`date '+%d'`
log=/home/minter/Reports/system/$day.txt
echo -e "GET http://router.vot HTTP/1.0\n\n" | nc router.vot 80 > /dev/null 2>&1
if [ $? -eq 0 ]; then
  :
else
  echo "$(date '+%H.%M.%S') -- wifi is not active" >> $log
fi
exit

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

13.00.12 -- wifi is not active

Действия при отсутствии ответа от роутера

К сожалению, планировавшиеся изначально остановка и последующий запуск сети к желаемому результату не привели:

/etc/init.d/networking stop

/etc/init.d/networking up

Поэтому было решено выключать wifi, а затем включать его снова.

Требуется указание на конкретную wifi, которое и было получено из ifconfig (или iwconfig). В моём случае этим wifi явилось устройство wlx000b819543a2 

Перед повторным включением wifi была задана пауза в 20 секунд.

Действия выполняются по сценарию sh:

#!/bin/bash
ifconfig wlx000b819543a2 down
sleep 20
ifconfig wlx000b819543a2 up
exit

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

Чтобы пароль не запрашивался, через команду sudo xed /etc/sudoers в файл sudoers была внесена строка:

minter ALL=NOPASSWD: путь с сценарию sh

minter – это моё имя пользователя в системе.

Итог

#!/bin/bash
day=`date '+%d'`
log=/home/minter/Reports/system/$day.txt
echo -e "GET http://router.vot HTTP/1.0\n\n" | nc router.vot 80 > /dev/null 2>&1
if [ $? -eq 0 ]; then
  :
else
  echo "$(date '+%H.%M.%S') -- wifi is not active" >> $log
  sudo /home/minter/Dropbox/scripts/modules/connect-net.sh
  echo "$(date '+%H.%M.%S') -- wifi restarted" >> $log
fi
exit

connect-net.sh – это сценарий перезапуска wifi

log – это файл протокола, из которого будет понятно в какое примерно время с точностью до 20 минут пропала связь с роутером.

✔   Примечание.  При тесте перезапуска wifi значок состояния сети на панели не изменялся. 

При тестировании сценария перезапуска wifi в логах роутера были получены записи:

00:0B:81:95:43:A2@wlan: disconnected, received deauth: sending station leaving (3)
00:0B:81:95:43:A2@wlan: connected, signal strength -58

Через 2 часа после публикации данной заметки состоялось практическая проверка реализации предложенного решения. Из протокола работы системы:

17.20.12 -- no wifi exists
17.20.12 -- wifi is not active
17.20.33 -- network restarted

Из лога MikroTik:

Sep/10/2021 17:06:13
00:0B:81:95:43:A2@wlan: disconnected, extensive data loss
Sep/10/2021 17:20:35
00:0B:81:95:43:A2@wlan: connected, signal strength -54

После этого связь с Интернет была восстановлена.

пятница, 3 сентября 2021 г.

Пакетное преобразование аудиокниг mp3 в формат ogg с заданным битрейтом


Возникла необходимость уменьшения размера аудиокниг. Как правило, аудиокниги распространяются в формате mp3 с битрейтом 128 и более. Вследствие этого зачастую одно произведение может достигать размеров в среднем 500-600 Мб.

Экспериментальным образом выяснено, что если такие произведения преобразовать с формат ogg с битрейтом 16, который мне показался вполне достаточным для нормального прослушивания речи, то можно получить выигрыш в размерах произведений в несколько раз. Строго фиксированное значение указать сложно, но в среднем оно у меня достигало величин в 6-10, а то и более раз. В частности, конвертация 50-минутного произведения Альфреда Бестера "Кто-то там наверху меня любит", представленного исходным файлом mp3 128 кбит/с размером в 120 Мб позволила получить на выходе вполне комфортно воспринимаемый на слух файл ogg размером в 6,5 Мб.
 
Для преобразования вам понадобится пакет ffmpeg, который можно установить командой  sudo apt install -y ffmpeg   

Сама команда для преобразования имеет вид:
 
ffmpeg -i file.mp3 -b:a 16k -acodec libopus file.ogg
 
На первых порах через особое действие в правом контекстном меню оболочки XFCE она мной использовалась как действие для каждого файла с выводом уведомления о том, что файл ogg готов:

ffmpeg -i %f -b:a 16k -acodec libopus %f.ogg && zenity --width=130 --height=50 --info --text "\nogg ready" 2>/dev/null

Однако неудобство заключалось в том, что результирующие файлы имели расширение mp3.ogg, что приводило к необходимости переименования их расширения в ogg вручную, а также то, что исходные файлы mp3 также приходилоcь удалять вручную.

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

1) указывается папка с файлами mp3, которые необходимо преобразовать;

2) осуществляется поиск в указанной папке файлов mp3 и каждый найденный фал преобразовывается в формат ogg;

3) после преобразования исходные файл mp3 удаляются;

4) расширение файлов mp3.ogg приводится к виду ogg.

Текст сценария:

#!/bin/bash
dir=$(zenity --file-selection --directory)
find "$dir" -name "*.mp3" -exec ffmpeg -i {} -b:a 16k -acodec libopus {}.ogg \;
find "$dir" -name "*.mp3" -exec rm {} \;
find "$dir" -name '*.mp3.ogg' -exec sh -c 'mv "$0" "${0%.mp3.ogg}.ogg"' {} \;

В XFCE можно создать значок запуска, присвоив ему какую-либо картинку, например:


и запускать его через команду "Выполнить" правого контекстного меню мыши. Либо для такого сценария sh добавить на панель элемент "Запуск приложений", впоследствии указав в нём путь к файлу sh и отображаемый значок.

В процессе преобразования сценарий может осуществлять преобразование файлов не последовательно, а по ему одному известной  😀  очерёдности, что, впрочем, никак не влияет на функциональность. Ход процесса отображается в окне терминала:


Если sh запускался не по команде в окне терминала, а по кнопке запуска, то после завершения всех процессов окно терминала будет закрыто. В папке с файлами аудиокниги будут присутствовать только файлы ogg.

четверг, 2 сентября 2021 г.

Пакетное преобразование mp3 в ogg

Пакет dir2ogg является сценарием Python, расписывающим порядок совместной работы различных программ – раскодировщиков и кодировщиков ogg, что позволяет облегчить работу ему или ей по преобразованию своих музыкальных файлов в другой формат. dir2ogg преобразовывает файлы MP3, M4A, WMA, FLAC, и WAV в открытый формат OGG. Сайт автора – https://jak-linux.org/projects/dir2ogg 

Для установки dir2ogg в систему выполните в терминале команду

 sudo apt install -y dir2ogg

Моё знакомство с dir2ogg состоялось в ходе поисков инструмента для пакетного преобразования аудиокниг mp3 в файлы c более низким чем оригиналы битрейтом. И хотя dir2ogg мою проблему решить не смог (вследствие наиболее низкого битрейта на выходе – 80) сам по себе представляет интересное решение, к тому же работающее весьма шустро.

Использование dir2ogg описывается короткой справкой, которую можно получить по команде терминала dir2ogg --help

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

dir2ogg -d "$(zenity --file-selection --directory)" -q N

N является цифрой, которая укажет с каким битрейтом осуществлять процесс перекодирования. К сожалению, в справке по пользованию это соответствие не приводится. Указывается только, что диапазон N составляет от 1 до 10, а значение по умолчанию равно 3. Соответствие значений N битрейту пришлось выяснять экспериментально:

  1 – 80
  2
96
  3
112
  4
128
  5
160
  6
192
  7
224
  8
256
  9
320
10
499

Пример работы dir2ogg указан на рисунке ниже:


среда, 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

понедельник, 2 ноября 2020 г.

Warpinator

Одной из новых функций Linux Mint 20 является встроенное в комплект поставки программное обеспечение Warpinator.

Для установки Warpinator в Linux Mint 19 можно использовать PPA:

sudo add-apt-repository -y ppa:clementlefebvre/grpc && sudo apt update && sudo apt install -y warpinator

Warpinator позволяет обмениваться файлами и папками между компьютерами локальной сети при отсутствии сервера DNS, осуществляющего преобразование имени компьютера в адрес IP. Как правило, при использовании роутера, который выдаёт компьютерам только адрес IP, в домашних условиях автоматически преобразовать имя узда в адрес IP не удастся. Вследствие этого компьютерам пользователей придётся либо назначать статический IP адрес, либо настраивать DHCP маршрутизатора (роутера) на выдачу компьютерам одних и тех же адресов IP постоянно. Из известных мне маршрутизаторов исключение составляет маршрутизатор MikroTik (подробности), который при получении клиентом адреса IP автоматически может вносить имя компьютера в записи сервера DNS.

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

Чтобы отправлять/получать файлы и папки на компьютерах приложение Warpinator должно быть запущено, что сделать через секцию "Инструменты" главного меню.

По умолчанию Warpinator запускается с отображением окна программы. Чтобы окно программы не отображалось и приложение сразу же сворачивалось в значок на панели (на рисунке ниже третий слева направо)


нажмите на кнопку с тремя вертикальными полосками главного окна программы и передвиньте влево переключатель "Начать с главного экрана".



На втором рисунке в настройках Warpinator показано, что при получении от другого компьютера файлов и папок дополнительных запросов на получение или перезапись данных в папке приёма Warpinator задаваться не будет, что позволит не отвлекаться от основной работы за компьютером. Получение данных будет сопровождаться только всплывающим уведомлением. Папка приёма Warpinator будет создана автоматически при первом запуске приложения. Расположение этой папки можно изменить или указать другую папку, которую Warpinator будет использовать для приёма файлов/папок от других компьютеров.

Запущенное приложение занимает порядка 70-90 Мб резидентной памяти компьютера.

Для запуска/остановки Warpinator по расписанию создайте два сценария в виде исполняемых файлов sh, например:

Запуск Warpinator:

#!/bin/sh
export DISPLAY=:0 && /usr/bin/warpinator &
exit

Остановка Warpinator:

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

Создайте 2 пользовательских задания cron на запуск и остановку Warpinator в указанное время или объедините эти задания в одно с указанием времени, в течение которого Warpinator будет запущен и находиться в ожидании команд отправки и приёма данных. Пример для времени в 2,5 часа (9000 секунд):

#!/bin/sh
export DISPLAY=:0 && /usr/bin/warpinator &
sleep 9000
warp="$(pidof warpinator)"
kill -15 ${warp}
exit


Следует отметить, что при использовании Cinnamon возможность отправки файлов и папок через Warpinator уже встроена в оболочку. По правому клику мыши вы можете выбрать объект(ы) и отправить через Warpinator и отправить выбранному получателю, например: