среда, 28 марта 2018 г.

Удаление ядер в Linux Mint и Ubuntu без запроса подтверждения


Про удаление "ненужных "ядер в Интернет имеется много информации, да и на этом ресурсе имеется соответствующая публикация.

Но со временем меня перестала устраивать необходимость всё время нажимать в терминале  клавишу y после "Хотите продолжить? [Д/н]". Поэтому для своего удобства был создан текстовый файл с набором впоследствии вставляемых в окно терминала набором команд, в которых необходимо менять только цифры.


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

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

Перечень установленных ядер можно посмотреть через менеджер файлов, обратившись к каталогу /boot  Там будут расположены несколько файлов с разными именами. Общим у них являются цифры, следующие после знака - . Поэтому для составления списка цифр достаточно посмотреть первые файлы в списке, т.е. файлы с именами, начинающимися на  abi .


Пояснение. abi – application binary interface – это файлы, являющиеся частью двоичным интерфейсом приложения и включены в ядро в качестве одной из его составных частей. Как поясняют назначение abi на англоязычных форумах,

The ABI is included as part of the kernel version. If you run the command uname -r you will see something like 2.6.26-4-generic. The 4 in this example is the ABI. Numerically, it means nothing, except that it has changed since 3 and will be 5 when it changes again. 

abi is the application binary interface, which are the kernel "hooks" a program can call to process commands, system libraries, etc. Because these machine language addresses move from time to time, the abi provides a common directory for applications to reference. 

Хорошей практикой считается удаление всех ядер за исключением текущего и ему предшествующего. Но если Вы уверены в том, что система со свежим ядром функционирует должным образом, то удалить можно все предыдущие. В соответствии с этим критерием, в рассматриваемом примере удалению подлежат ядра 4.13.0-26, 4.13.0-31, 4.13.0-32, 4.13.0-36.

Дополнение. К имеющим отношения к ядрам также относятся и каталоги с файлами и вложенными каталогами, расположенные в /lib/modules



Составление команды для удаления выбранных ядер

Командами для удаления ядра являются sudo apt purge linux-image- и sudo apt purge linux-headers-  Например, для удаления ядра 4.13.0-32 указанные команды приобретут вид sudo apt purge linux-image-4.13.0-32 и sudo apt purge linux-headers-4.13.0-32  Чтобы не вводить эти команды по одной между нами пишутся два символа &&. Поэтому командой удаления ядра 4.13.0-32 в одну строку является

purge linux-image-4.13.0-32 && sudo apt purge linux-headers-4.13.0-32

Так как в примере моё намерение включает удаления ядер 4.13.0-26, 4.13.0-31, 4.13.0-32, 4.13.0-36, то командой для их удаления будет являться

sudo apt purge linux-image-4.13.0-26 && sudo apt purge linux-headers-4.13.0-26 && sudo apt purge linux-image-4.13.0-31 && sudo apt purge linux-headers-4.13.0-31 && sudo apt purge linux-image-4.13.0-32 && sudo apt purge linux-headers-4.13.0-32 && sudo apt purge linux-image-4.13.0-36 && sudo apt purge linux-headers-4.13.0-36

Примечание. 

Профессионалы, конечно, могут меня "тыкнуть носом" в то, что более грамотной командой будет являться sudo apt purge linux-image-4.13.0-{26,31,32,36} && sudo apt purge linux-headers-4.13.0-{26,31,32,36}. 

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

А поскольку мне проще в команды после image- и headers- дописывать номера ядер, то пишу в столбик

sudo apt purge linux-image-4.13.0-26 
sudo apt purge linux-headers-4.13.0-26
sudo apt purge linux-image-4.13.0-31
sudo apt purge linux-headers-4.13.0-31
sudo apt purge linux-image-4.13.0-32
sudo apt purge linux-headers-4.13.0-32
sudo apt purge linux-image-4.13.0-36
sudo apt purge linux-headers-4.13.0-36

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

Как указано выше, чтобы не вводить каждый раз y на вопрос "Хотите продолжить? [Д/н]", в команду удаления после sudo apt purge добавляется -y. При этом предполагается ответ Yes на все вопросы, а сами вопросы не выводятся. Команда – sudo apt purge -y

Таким образом, итоговой командой для удаления ядер 4.13.0-26, 4.13.0-31, 4.13.0-32, 4.13.0-36 без ввода подтверждения своих действий является

sudo apt purge -y linux-image-4.13.0-26 && sudo apt purge -y linux-headers-4.13.0-26 && sudo apt purge -y linux-image-4.13.0-31 && sudo apt purge -y linux-headers-4.13.0-31 && sudo apt purge -y linux-image-4.13.0-32 && sudo apt purge -y linux-headers-4.13.0-32 && sudo apt purge -y linux-image-4.13.0-36 && sudo apt purge -y linux-headers-4.13.0-36

Примечание. На многих ресурсах для удаления всех ядер кроме используемого приводится команда (в одну строку)

sudo apt-get purge $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)

Но мной она никогда не применялась, поэтому прокомментировать её никак не могу.

Важно. Не удаляйте ядро, которое активно в Вашей системе. Чтобы его узнать введите в терминале uname -r.  В противном случае Вы пополните круг пользователей, задающих вопрос: "я удалил все ядра, что мне делать?".

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



Хотя у меня такого не возникло, но если вдруг в каталоге modules "лишние" каталоги не были удалены, то можно использовать команду, например,

sudo rm -R /lib/modules/4.13.0-26-generic && sudo rm -R /lib/modules/4.13.0-31-generic && sudo rm -R /lib/modules/4.13.0-32-generic && sudo rm -R /lib/modules/4.13.0-36-generic

Примечание. О неудалении относящихся к ядрам каталогов в /lib/modules свидетельствуют выводы в окне терминала, такие как, например, это

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


Надо обновить GRUB!

Раньше такое действие мной и применялось, поэтому в конец команды удаления дописывалось  && sudo update-grub

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

Найден образ linux: /boot/vmlinuz-4.13.0-37-generic
Найден образ initrd: /boot/initrd.img-4.13.0-37-generic
Найден образ linux: /boot/vmlinuz-4.13.0-36-generic
Найден образ initrd: /boot/initrd.img-4.13.0-36-generic
Найден образ linux: /boot/vmlinuz-4.13.0-32-generic
Найден образ initrd: /boot/initrd.img-4.13.0-32-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
завершено

А после завершения удаления ядра 4.13.0-36

Найден образ linux: /boot/vmlinuz-4.13.0-37-generic
Найден образ initrd: /boot/initrd.img-4.13.0-37-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
завершено

Поэтому необходимости в sudo update-grub не вижу.


Послесловие

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

Американский форум – задал вопрос, тебе обстоятельно и вежливо ответили.
Еврейский форум – задал вопрос, тебе задали вопрос.
Русский форум – задал вопрос, тебе объяснили какой же ты мудак.

четверг, 22 марта 2018 г.

Удаление по расписанию из Thunar


В процессе поиска материалов о возможности создания заданий cron от имени пользователя на форуме русскоязычного сообщества Ubuntu была найдена ветка обсуждений "Контекстное меню Thunar. Делимся своими конфигами". Меня заинтересовало сообщение с пояснением "Этим скриптом можно удалить файлы по расписанию:".

Текст скрипта приводится следующий:

Удаление по расписанию
<action>
<icon>appointment-new</icon>
<name>Удалить позже...</name>
<command>z=$(zenity --forms --title=&quot;Удалить в указанное время.&quot; --text=&quot;(Полученое задание: crontab -l)&quot; --separator=&quot;.&quot; --add-entry=&quot;Час, 0-23&quot; --add-entry=&quot;Мин, 0-59&quot; --add-calendar=&quot;День,&quot; --add-list=Удалить --list-values=&apos;В корзину|Безвозвратно|Спросить&apos;); if [ -n &quot;$z&quot; ]; then c=&quot;$HOME/tmp$(date +%s).cron&quot;;crontab -l &gt;&quot;$c&quot; ;echo &apos;## Задание Thunar&apos; &gt;&gt;$c ;h=$(echo $z|awk -F. &apos;{print $1}&apos;); m=$(echo $z|awk -F. &apos;{print $2}&apos;); if [ &quot;$h&quot; -lt &quot;24&quot; -a &quot;$m&quot; -lt &quot;60&quot; ]; then echo -n $m $h $(echo $z|awk -F. &apos;{print $3 &quot; &quot; $4 }&apos;) &apos;* &apos;&gt;&gt;$c;case &quot;$(echo $z|awk -F. &apos;{print $6}&apos;)&quot; in &quot;Спросить&quot;) echo &quot;if /usr/bin/zenity --display=:0 --list --timeout=90 --title=&apos;Расписание&apos; --text=&apos;Удалить следующие файлы?&apos; --hide-header --column=&apos;&apos; %N ;then gvfs-trash -f %F;fi&quot;&gt;&gt;$c;; &quot;В корзину&quot;) echo &quot;gvfs-trash -f %F&quot;&gt;&gt;$c;; &quot;Безвозвратно&quot;) echo &quot;gvfs-rm -f %F&quot;&gt;&gt;$c;; esac;echo &gt;&gt;$c;crontab $c;rm -v $c;for z in %F;do gvfs-set-attribute &quot;$z&quot; -t stringv metadata::emblems emblem-danger;done;notify-send -i info &quot;Задача добавлена.&quot; &quot;Для просмотра используйте: crontab -l&quot;;fi;fi</command>
<description>Удаление файлов по расписанию</description>
<patterns>*</patterns>
<directories/>
<audio-files/>
<image-files/>
<other-files/>
<text-files/>
<video-files/>
</action>

При создании пункта особых действий в Thunar (пример создания особых действий читайте здесь) из приведенного выше текста используется только команда, то есть то, что расположено между <command> и </command>. Но если указать приведенную выше команду, то она не сработает и не по причине того, что скрипт неправильный.

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

z=$(zenity --forms --title="Удалить в указанное время." --text="(Полученное задание: crontab -l)" --separator="." --add-entry="Час, 0-23" --add-entry="Мин, 0-59" --add-calendar="День," --add-list=Удалить --list-values='В корзину|Безвозвратно|Спросить'); if [ -n "$z" ]; then c="$HOME/tmp$(date +%s).cron";crontab -l >"$c" ;echo '## Задание Thunar' >>$c ;h=$(echo $z|awk -F. '{print $1}'); m=$(echo $z|awk -F. '{print $2}'); if [ "$h" -lt "24" -a "$m" -lt "60" ]; then echo -n $m $h $(echo $z|awk -F. '{print $3 " " $4 }') '* '>>$c;case "$(echo $z|awk -F. '{print $6}')" in "Спросить") echo "if /usr/bin/zenity --display=:0 --list --timeout=90 --title='Расписание' --text='Удалить следующие файлы?' --hide-header --column='' %N ;then gvfs-trash -f %F;fi">>$c;; "В корзину") echo "gvfs-trash -f %F">>$c;; "Безвозвратно") echo "gvfs-rm -f %F">>$c;; esac;echo >>$c;crontab $c;rm -v $c;for z in %F;do gvfs-set-attribute "$z" -t stringv metadata::emblems emblem-danger;done;notify-send -i info "Задача добавлена." "Для просмотра используйте: crontab -l";fi;fi

Пользователям Runtu

Вследствие особенностей сборки при использовании указанного выше текста скрипта системное уведомление (оповещение) "Задача добавлена ..." работать не будет. Чтобы системное уведомление отображалось, вместо

notify-send -i info "Задача добавлена." "Для просмотра используйте: crontab -l"

используйте команду (текст можете изменить на свой)

zenity --notification --text "\n\nЗадание на удаление создано.\n\nДля просмотра введите crontab -l\n\n"

или попробовать установить пакет libnotify-binsudo apt install libnotify-bin


При запуске из контекстного меню Thunar отобразится окно запроса, например:


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

Задание действительно создаётся, за что следует поблагодарить автора данного скрипта. Однако чтобы его просмотреть, Вам всё равно придётся ознакомиться с некоторыми понятиями во вопросу планировщика заданий cron. Для практического использования рассматриваемого скрипта имеет смысл прочитать п.п. 2 и 4 публикации "Пользовательское задание cron в Linux Mint и Ubuntu".

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

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

sudo rm /var/spool/cron/crontabs/user

В этой команде user будет являться файлом cron пользователя системы user. Если у Вас другой логин, например boss, то вместо user будет boss.

Созданное мной через Thunar пользовательское задание имело такую строку:

55 21 21 03 * gvfs-trash -f '/home/cemea/Article.pdf'


Примечание.

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


  gvfs-trash -f 'путь_к_контенту' 'путь_к_контенту'

При других вариантах удаления используются команды:

безвозвратно – gvfs-rm -f 'путь_к_удаляемому_контенту' ;

спросить – на примере удаления из каталога Mount файла с именем

09. Эдуард Артемьев - Солярис OST [1972] - Track 01 - J. S. Bach's.mp3

if /usr/bin/zenity --display=:0 --list --timeout=90 --title='Расписание' --text='Удалить следующие файлы?' --hide-header --column='' '09. Эдуард Артемьев - Солярис OST [1972] - Track 01 - J. S. Bach'\''s.mp3' ;then gvfs-trash -f '/home/cemea/Mount/09. Эдуард Артемьев - Солярис OST [1972] - Track 01 - J. S. Bach'\''s.mp3';fi


При этом в менеджере файлов Thunar файлу автоматически назначается эмблема


В случае планирования удаления каталогов им также назначается эмблема


Возможно, Вы пожелаете внести некоторые изменения в текст скрипта.

Другая эмблема

Обратитесь к тексту скрипта, найдите в нём значение emblem-danger и вместо него укажите наименование желаемой эмблемы.


Точное наименование эмблем (текст то точки) смотрите в каталоге
 /usr/share/icons/каталог_темы/emblems в любом вложенном каталоге.


Например, в Linux Mint с темой значков Mint-X наименования эмблем можно посмотреть в каталоге  /usr/share/icons/Mint-X/emblems/48

Про собственные эмблемы можно найти материал на этой странице.

Изменение вопроса

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

   --text='Удалить следующие файлы?' и вместо него укажите:

   --text='Удалить выбранное?'

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

воскресенье, 18 марта 2018 г.

Проблема с отображением занятого места на Google Диск

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

При полностью синхронизированных данных ПК с облаком разбежка составила более 4 Гб. При этом после операции очистки Корзины через браузер указанное значение не изменилось.

После некоторого перебирания пунктов меню управления данными через браузер выяснилось, что при переходе по вкладке "Недавние"


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

При удалении по вкладке "Недавние" приходилось несколько раз перезапускать Google Диск через браузер. В частности, на одном из промежуточных этапов при отсутствии отображения каких-либо файлов по вкладке "Недавние" и полной очистке Корзины отображаемое занимаемое место значительно отличалось от реального размера синхронизируемых данных. При общем объёме синхронизируемых данных в 996 Мб занимаемое данными место на Google Диске всё ещё составляло 2,8 Гб.


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

Результатом попыток "вспомнить всё" явилось предположение, что непонятно где "болтающиеся" данные раньше отображались на вкладке "Компьютеры",


после которой была ещё вкладка "Мой компьютер", и в ней – наименования синхронизируемых папок ПК вне пределов папки Диска Google.

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

Странная, на мой взгляд, реализация системы хранения данных при совместной работе в папках общего доступа. Такого не наблюдается в других облачных решениях, таких как Яндекс.Диск, MEGA, pCloud.

К слову, в конце февраля Яндекс реализовал функцию, которая раньше присутствовала только в pCloud: при совместной работе папка, которую Вам дал в доступ другой пользователь, больше не занимает Вашего дискового пространства.


понедельник, 12 марта 2018 г.

Пользовательское задание cron в Linux Mint и Ubuntu


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

Примечание. Так как создание пользовательского задания cron осуществлялось для Linux Mint и Runtu (Runtu является адаптированной к русскоязычному пользователю Ubuntu с графическим окружением xfce), то далее в тексте будут даваться пояснения для обоих дистрибутивов.


1. Где посмотреть расписание заданий cron?

Так как рассматривается задача запуска именно пользовательских заданий cron, то статьи с упоминаниями о cron.hourly, cron.daily, cron.weelky, cron.mounthly в каталоге etc можете даже не читать. По умолчанию, эти задания являются системными и определены для запуска от суперпользователя root. Если интересно, то можете открыть эти каталоги (только для просмотра не потребуется команда sudo) и ознакомиться с содержанием расположенных там файлов. Расписанием этих заданий является файл /etc/crontab

Ваши пользовательские задания будут расположены в каталоге
 /var/spool/cron/crontabs, но под своим именем просмотреть их будет невозможно:


Чтобы удовлетворить своё любопытство, запустите файловый менеджер с правами суперпользователя, например,

  sudo mc, sudo thunar (sudo nemo или sudo caja).

Так как раньше Вы не создавали заданий, то этот каталог будет пуст.


2. Инструмент для редактирования файла заданий cron

Командой редактирования файла заданий cron является crontab -e

Linux Mint

В Linux Mint Вас может ожидать сюрприз, так как будет запущен редактор nano.


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

У Вас установлена такая, на мой взгляд, наиполезнейшая вещь? Если нет, то откройте терминал и введите команду sudo apt install mc.

EDITOR=mcedit crontab -e


Так как в дальнейшем вместо crontab -e вводить EDITOR=mcedit crontab -e затруднительно (забывается, понимаете ли), то включите в файловом менеджере отображение скрытых файлов, в файл .bashrc своего домашнего каталога внесите строку export EDITOR=mcedit и сохраните файл. Теперь при дальнейших вводах команды  crontab -e  у Вас будет запускаться  mcedit.


Runtu

В Runtu редактор nano в сборку не включён, а Midnight Commander наоборот – включён в комплект поставки. Поэтому здесь сюрприза не было. При вводе команды crontab -e система выдала запрос на выбор редактора:

Select an editor.  To change later, run 'select-editor'.
  1. /usr/bin/mcedit
  2. /usr/bin/vim.tiny

Choose 1-2 []:

При выборе 1 система запомнила мой выбор и больше вопросов не задавала.


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


3. Что будет запускаться по расписанию?

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

Примечание. 

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

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

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

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

1. Ежедневный запуск Dropbox в выбранное время.
2. Ожидание определённое время, в течение которого производится синхронизация папок и файлов.
3. Остановка Dropbox.

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

Условно реализацию работы в фоновом режиме назову "Вариант 1", а с выводом на экран монитора – "Вариант 2".

3.1. Вариант 1

Так как в варианте 1 взаимодействия с рабочим столом не предусматривается, то определяю перечень необходимых команд, записанных в файл daily-dropbox моего домашнего каталога.

Примечание. Как было отмечено выше, упомянутый файл можно оформить и как файл daily-dropbox.sh  Для системы разница в именах файла принципиального значения не имеет. Единственным требованием является то, что этот файл должен быть исполняемым. 

#!/bin/bash
dropbox start
sleep 15
rm /home/cemea/.config/autostart/dropbox.desktop
sleep 1200
dropbox stop

dropbox start – запуск dropboxd.

sleep 15 – пауза 15 секунд. Пауза необходима для того, чтобы запускаемый Dropbox "успел" создать ярлык автозапуска (что он в моей системе каждый раз делает). 15 секунд установлены экспериментально, так как при определённой степени загруженности системы Dropbox стартует не моментально.

rm /home/cemea/.config/autostart/dropbox.desktop – данная команда удаляет принудительно создаваемый в xfce ярлык запуска Dropbox при старте системы когда пользователь запускает Dropbox из меню программ (подробности).

sleep 1200 – пауза 1200 секунд, что соответствует 20-ти минутам (20х60). Предполагается, что этого времени будет достаточно, чтобы была осуществлена синхронизация каталога клиента Dropbox с облаком Dropbox.

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

dropbox stop – остановка dropboxd. По этой команде Dropbox прекращает свою деятельность. Поэтому к данным большого объёма будет применяться правило "кто не успел, тот опоздал". Другими словами, их синхронизация будет продолжена в течение последующих сеансов работы Dropbox или завершена при ручном запуске клиента Dropbox.

Для подобных файлов у меня заведён специальный каталог Tools. Поэтому для своего удобства создаю в нём каталог cron и помещаю в него файл daily-dropbox. Далее в свойствах файла (секция "Права") ставлю галочку в поле "Разрешить запуск этого файла в качестве программы".

3.2. Вариант 2

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

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

Поэтому в предыдущий текст будут добавлены такие команды. Вместо команды dropbox start будет использоваться dropbox start -i. Для моего графического окружения xfce принципиального значения между dropbox start и dropbox start -i нет, но в меню программ для запуска клиента Dropbox используется именно команда dropbox start -i.

Содержание исполняемого файла dropboxme.sh:

#!/bin/bash
zenity --info --text "Запуск клиента Dropbox." 2>/dev/null --timeout=3
dropbox start -i
sleep 15
rm /home/celesta/.config/autostart/dropbox.desktop
zenity --info --text "Автозапуск Dropbox удалён." 2>/dev/null --timeout=3
sleep 1200
zenity --info --text "Завершение работы Dropbox." 2>/dev/null --timeout=3
dropbox stop


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

Ввожу команду  crontab -e

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

no crontab for cemea - using an empty one

В запустившемся редакторе mcedit в новой строке пишу

15 22 * * * /home/cemea/Tools/cron/daily-dropbox

Что это означает?

Каждая задача формируется следующим образом:

минута  час  день  месяц  день_недели  команда

Соответственно, в диапазонах возможных цифр строка выглядит:

0 ... 59   0 ... 23   1 ... 31   1 ... 12   0 ... 7   команда


Поле "пользователь" присутствует только в таблицах /etc/crontab и др. расположенных в каталоге /etc/cron.d/.

Дополнительные варианты

Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 означает целые числа 1, 2, 3 и 4.

Список значений, разделённых запятыми, обозначает перечень. Например, перечисление 3, 4, 6, 8 означает четыре указанных целых числа.

Косая черта (/) используется для определения шага значений. Если после диапазона указать /<целое_число>. Например, значение минут 0-59/2, определяет, что задание будет запущено каждую вторую минуту.

Если вместо цифры введён символ *, то он соответствует "каждый/ую".

То есть, говоря проще, каждый день недели в 22 часа 15 минут будет запущена задача на синхронизацию Dropbox – /home/cemea/Tools/cron/daily-dropbox.

После ввода строки 15 22 * * * /home/cemea/Tools/cron/daily-dropbox нажимаю клавишу Enter, чтобы курсор перешёл на следующую строку. Если этого не сделать, то при попытке сохранения Вам будет выдано предупреждение:

new crontab file is missing newline before EOF, can't install.
Do you want to retry the same edit? (y/n)

При сохранении Вам будет выдан запрос


Пусть Вас не смущает предложение сохранить задание в каталог  /tmp  да ещё и под каким-то непонятным именем. Жмите "Сохранить".

Если в течение этого сеанса редактирования Вы не планируете вносить какие-либо изменения в свой crontab, то по F10 закрывайте mcedit.

Так как терминал у Вас ещё открыт, то Вы увидите, что в его окне появилось сообщение – crontab: installing new crontab

При назначении задания по варианту 2 строка моего задания имеет вид:

15 22 * * * export DISPLAY=:0 && /home/cemea/Tools/configs/dropboxme.sh

Это важно. Обратите внимание, что DISPLAY должно быть именно заглавными буквами. Если указать export display=:0, то на экране ничего не отобразится. Желающие получить теоретическое обоснование читают ветку форума.

Если поинтересоваться содержанием каталога /var/spool/cron/crontabs, то можно будет увидеть, что в нём появился файл c именем пользователя системы. В моём случае это файл cemea:


В этом файле и будут в дальнейшем находиться все пользовательские задания cron. Этих заданий может быть несколько. Применительно к рассматриваемой задаче внесу 2 задания. Первое будет запускать синхронизацию Dropbox c отображением его значка и всех информационных сообщений, а второе будет запускать синхронизацию Dropbox "тихо", не отвлекая меня от деятельности на благо общества. Например:

15 09 * * * export DISPLAY=:0 && /home/cemea/Tools/configs/dropboxme.sh
30 16 * * * /home/cemea/Tools/cron/daily-dropbox

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

Для просмотра своих заданий используйте команду  crontab -l

Для удаления файла своих заданий используйте команду  crontab -r


5. Экспериментальная проверка

Как говорится, практика – критерий истины, поэтому проверим отработку назначенного задания.

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

Linux Mint



На рисунках звёздочками красного цвета отмечены выполняющиеся файл задания cron daily-dropbox, Dropbox (повторять длинную строку не буду), а также выполняемая на момент просмотра диспетчера задач команда speep 1200.

Соответственно, если вместо исполняемого файла запущен файл sh, то он и будет отображён в диспетчере задач. Так как выше речь шла про dropboxme.sh, то


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

Runtu

В Runtu вместо длинной строки dropbox-dist/... отображается просто dropbox, а вместо sleep 1200 только sleep. При имени исполняемого файла не daily-dropbox, а dropbox.sh будет отображён dropbox.sh


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


6. А что ещё можно запускать?

Применяя инструкцию export DISPLAY=:0 && команда можно запланировать себе запуск желаемых графических приложений.

В частности, в какое-то время запустить браузер Firefox, в адресную строку которого автоматически будет вписан адрес ресурса, например, news.mail.ru  В этом случае содержание исполняемого файла будет следующим:

#!/bin/bash
firefox "http://news.mail.ru"

А в качестве прикола можно поставить себе напоминание:

#!/bin/bash
zenity --info --text "А не испить ли мне кофею?" 2>/dev/null --timeout=60

И вот сижу я, смотрю на экран, а мне вдруг выскакивает:


Поэтому здесь имеется простор для воплощения Ваших фантазий в наборы инструкций операционной системе. Главное – вводить правильные команды.

понедельник, 5 марта 2018 г.

Автозавершение Dropbox через указанное время в Linux

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

Решением задачи является дополнение двумя командами скрипта, описанного в заметке о предотвращении самопроизвольного восстановления автостарта клиента Dropbox при запуске системы (подробности).

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

sleep 1200
dropbox stop

1200 указывает на 20 минут (20x60). Для себя Вы можете указать другое значение.

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

#!/bin/bash
zenity --info --text "Запуск клиента Dropbox." 2>/dev/null --timeout=3
dropbox start -i
sleep 7
rm "/home/user/.config/autostart/dropbox.desktop"
zenity --info --text "Автозапуск Dropbox удалён." 2>/dev/null --timeout=3
sleep 1200
dropbox stop

Если вместо информационного сообщения по центру экрана Вы предпочитаете видеть вплывающие системные уведомления (оповещения), то вместо строки

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

используйте строку  notify-send -i info "Текст сообщения."

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

sudo apt install libnotify-bin


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

#!/bin/bash
dropbox start -i
sleep 7
rm "/home/user/.config/autostart/dropbox.desktop"
sleep 1200
dropbox stop

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

При экспериментальной проверке контроль осуществлялся по диспетчеру задач xfce. После запуска скрипта видно, что работают клиент Dropbox
dropbox-dist/dropbox-lnx.x86_64-45.3.88/dropbox и скрипт dropboxme.sh


Выполняющуюся команду sleep можно увидеть в списке задач ниже


После остановки Dropbox скрипт также прекращает свою работу


Отображение в Ubuntu 16.04.4

Экспериментальная проверка производилась на системе Runtu, которая является адаптацией xUbuntu для русскоязычного пользователя. Контроль осуществлялся по диспетчеру задач. Отображение в этой системе немного отличается от отображения в Linux Mint. Работа клиента Dropbox отображается процессом dropbox. Чтобы увидеть отображение работы скрипта необходимо перейти в конец списка запущенных задач.



Когда выполняется команда sleep в диспетчере задач она также отображается.


пятница, 2 марта 2018 г.

Календарь в XFCE

Один из моих "собратьев по Linux" подвергал меня критике по поводу того, что у меня в системе нет даты. На что неизменно получал ответ: "Зачем мне дата? Мне и без даты ... хорошо".

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



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

В текстовом редакторе внести строки:

#!/bin/sh
ncal
sleep 7; exit

Сохранить полученное как файл с расширением sh, например, calendar.sh  В свойствах файла найте и поставьте галочку в поле "Разрешить выполнение этого файла как программы" (Свойства – Права). Создать кнопку запуска (значок запуска) данного скрипта sh, указав в его свойствах параметр "Запускать в терминале". Проверить работу кнопки запуска. Должно получиться:


Если в тексте скрипта указать не ncal, а cal, то вывод текущего месяца будет таким, как принято в странах Западной Европы. Т.е. первым днём недели будет являться не понедельник, а воскресенье.


Аналогичным образом можно осуществить вывод текущего месяца, предыдущего и последующего. В этом случае вместо команды ncal необходимо указать команду ncal -3, а чтобы "рассмотреть" полученный вывод сделать автозакрытие окна не через 7 секунд, а, например, через 40. Тогда полный текст скрипта примет вид:

#!/bin/sh
ncal -3
sleep 40; exit


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

Экспериментально было установлено, что в моём случае эти значения составляют 80х30. В этом случае содержание скрипта sh будет следующим:

#!/bin/sh
xfce4-terminal --geometry=80x30 --hold -e "ncal -y"
exit

При создании кнопки запуска в свойствах не ставить галочку в параметре "Запускать в терминале", так как команда запуска терминала уже присутствует в тексте скрипта (xfce4-terminal). Завершение работы скрипта произойдёт после закрытия окна терминала вручную.

В результате у меня получилось:



четверг, 1 марта 2018 г.

Часы в XFCE

После установки Linux с XFCE на панели отображаются часы. По умолчанию, они выводятся в цифровом формате и имеют вид:


За отображение часов на панели отвечает элемент "Дата и время (внешний)", который можно увидеть с секции "Элементы" параметров панели. В своей работе мне иногда приходится смотреть на подключенный к другому компьютеру монитор, отстоящий на 1-2 метра от основного рабочего. В этом случае увидеть часы бывает немного проблематично, так как вследствие "мелкого" шрифта к ним приходится присматриваться.

В описываемом случае поможет установка на панель дополнительного элемента "Часы", для чего необходимо кликнуть правой кнопкой мыши по панели и перейти по меню "Панель – Добавить новые элементы ..."


По умолчанию, данный элемент будет отображать второй экземпляр уже имеющихся часов. Но если вызвать свойства этого элемента и вместо вида "Цифровые" выбрать "ЖК", то можно добиться отображения более крупных цифр.




При желании можно дополнительно настроить отображение секунд, мигающих разделителей или отображения не в 24-часовом, а в 12-часовом формате (am и pm), устанавливая и снимая галочки в секции "Параметры часов" свойств элемента.


Любители красивостей или те, кто привык к апплету часов как в Windows могут использовать следующий приём.

Откройте текстовый редактор и впишите в него текст:

#!/bin/sh
xclock
sleep 3 && exit

Сохраните файл как файл с расширением sh, например, clock.sh  В свойствах файла найдите и поставьте галочку в поле "Разрешить выполнение этого файла как программы" (Свойства – Права).

Создайте значок запуска (кнопку запуска) на созданный файл. После запуска у Вас должно получиться что похожее на это:


После того как Вы нажмёте на крестик и закроете окно часов скрипт clock.sh через 3 секунды прекратит работу и исчезнет из диспетчера задач.

Если необходимо запускать эту "красоту неописуемую" при старте системы, то создайте соответствующую запись в "Сеансы и запуск", например: