Скрипт шелла Linux, который ищет пустые каталоги и удаляет их.
Если системный администратор не хочет сохранять пустые каталоги, этот скрипт может быстро удалить все из них.
Вы можете ввести путь, в котором вам нужно искать пустые каталоги.
Сценарий будет подтвержден до удаления пустого каталога.
Содержание скрипта:
#!/bin/bash
#Check if user input parameter, if not ask to enter directory
if [ x"$1" = "x" ]; then
#Ask user to input directory where to start search for empty directories.
echo -n "Please enter directory where to delete empty folders: "
#we read input
while read dir
do
#we check if input empty
test -z "$dir" && {
#if input empty – we ask once more to input directory
echo -n "Please enter directory: "
continue
}
#if entered no empty data – continue to do other things
break
done
#if user entered parameter do next:
else
#dirname will be passed parameter
dir=$1
fi
#this check if directory exist, exit if not
if [ ! -d $dir ]; then
echo "No such directory"
exit 1
fi
#We will store list of all directories in temporary file
DirList=/tmp/ditlist.tmp
# we search for all directories
find $dir -type d > $DirList
#writing all directories to vatiable
dirs=`cat $DirList`
#start checking every directory
for dir in $dirs
do
#we are checking if directory is empty
[ `ls $dir | wc -l` -lt 1 ] || continue
#this ask user if really delete directory
echo -n "Remove empty directory $dir: [No/yes] "
#reading users answer:
read answer
#Checing answer, if yes – we will delete folder, nothing in other case:
if [ "$answer" = "yes" ]; then
rmdir "$dir"
fi
done
Время от времени часы на компьютере могут сбиваться по различным причинам, время может быть установлено изначально неправильно или неправильно выбран часовой пояс. Хотя в системе по умолчанию настроена синхронизация времени с интернетом и я уже давно забыл что значит постоянно перенастраивать часы, если они отстают, такая необходимость может появиться.
В этой статье мы рассмотрим как выполняется установка времени Linux различными способами, через терминал, графический интерфейс и так далее. Но сначала нам нужно понять как работает время.
Как работает время на компьютере?
Статья ориентирована на новичков, в первую очередь на них, потому что профессионалы уже и так знают как это сделать. Поэтому сначала рассмотрим как работает время в Linux. Когда компьютер работает часы идут, это ясно, но когда вы его отключаете, а затем включаете снова часы показывают не то время, на котором остановились, а правильное время. Это происходит потому, что часы на материнской плате идут постоянно. Таймер питается от той же батарейки, что и энергозависимая память BIOS.
Операционная система передает значение таймера в память BIOS при выключении и берет его оттуда при включении. Отсюда берутся проблемы со временем при двойной загрузке Windows и Linux, но эта тема раскрыта в другой статье — сбивается время в Ubuntu и Windows. Другая проблема почему может сбиваться время — это неверно установленный часовой пояс. Если вы установили часовой пояс linux неверно, то часы будут постоянно синхронизироваться через интернет и идти неверно.
Когда все проблемы с временем будут устранены, можно перейти установить нужное время и быть уверенным что оно не будет сбиваться. Дальше рассмотрим как это сделать.
Установка времени Linux
Вы можете видеть текущее время прямо на вашем рабочем столе, в KDE часы добавлены на панель, да и в Gnome, они размещены по центру панели по умолчанию:
Если навести курсор на время, вы увидите более подробную информацию, область уведомлений и календарь.
Но настроить время здесь уже не получится. Для этого нужно открывать настройки системы. Мы будем рассматривать настройки для Gnome. Откройте меню Dash и наберите в строке поиска «Параметры»:
Дальше откройте «Дата и время»:
Как видите, здесь уже установлено значение по умолчанию «Автоматическое определение даты и времени», а внизу есть пункт, который отвечает за часовой пояс.
Вы можете просто поменять часовой пояс чтобы время синхронизировалось правильно, если что-то не так. Также можно задать время вручную. Для этого сначала отключите автоматическую синхронизацию, а затем выберите дату и время:
Никаких кнопок нажимать не нужно, закройте окно выбора и новое время будет применено. Вы всегда можете вернуть настройки до значения по умолчанию.
Установка времени через терминал
Кроме графического интерфейса, у вас есть возможность делать все необходимые действия через терминал. Для этого есть утилита date. Сначала смотрим текущее время:
date
У утилиты есть множество опций отображения и настроек, но мы не будем их рассматривать. Есть еще одна команда, которая позволяет посмотреть системное время linux:
sudo hwclock -r
Чтобы установить время можно использовать ту же команду date. Для этого ей нужно передать строку со временем и датой, например:
date --set="строка"
В качестве строки можно брать ту, которую возвращает команда date без параметров, только она должна быть на английском, поэтому сразу смотрим:
LANG=en_US date
Затем меняем:
sudo date --set "Wed Sep 6 20:43:36 EEST 2017"
Если у вас включена коррекция даты через интернет, то ее нужно отключить перед этим, потому что вы даже заметить изменений не успеете, как сервер времени linux установит правильное время. Можно сократить эту строку:
sudo date --set "Sep 6 20:43:36 2017"
Это даст тот же результат. Еще один вариант — указать формат данных, которые вы собираетесь передавать с помощью модификаторов, например, изменить время linux:
sudo date +%T -s "20:43:36"
Здесь формат очень прост — часы:минуты:секунды. Можно давать время в 12 часовом формате, для этого добавьте модификатор %p:
date +%T%p -s "8:43:36PM"
Вы изменяете текущее время, но аппаратное системное время linux не изменяется, чтобы сохранить изменения используйте команду:
sudo hwclock -w
Еще один новый инструмент от systemd для управления временем — timedatectl. С помощью него можно выполнить те же операции, сначала смотрим доступную информацию о времени:
timedatectl
Текущее системное время отображается в строке Local Time. Чтобы изменить дату, используйте опцию -set-time. Синтаксис передаваемого ей параметра такой: ГГГГ-ММ-ДД ЧЧ:ММ:СС. Думаю тут понятно и без комментариев. Например:
sudo timedatectl --set-time "2017-09-06 20:43:36"
Можно задать только время, тогда нужно использовать синтаксис времени ЧЧ:ММ:СС, например:
sudo timedatectl --set-time "20:43:36"
Еще раз говорю, что если включена синхронизация по сети, то вы не сможете изменить время. Но с помощью timedatectl ее можно отключить:
sudo timedatectl set-ntp no
Или включить обратно:
sudo timedatectl set-ntp yes
C помощью этой же команды можно не только установить время linux, но и настроить часовой пояс, для этого используйте опцию set-timezone:
sudo timedatectl set-timezone 'EuropeKyiv'
Вы можете посмотреть список доступных часовых поясов командой:
timedatectl list-timezones
Видео о настройке времени с помощью timedatectl:
Выводы
Вот и все. Теперь вы знаете как выполняется установка времени linux. Как видите, это очень просто, вы можете использовать различные способы, в зависимости от того, что вам будет удобнее. Если у вас остались вопросы, спрашивайте в комментариях!
Имеется небольшой call-центр. Все входящие звонки с разных линий и номеров сначала поступают на сервер Asterisk (FreeBSD+Asterisk 11.14.1), а он в свою очередь распределяет эти звонки между всеми операторами по определенному сценарию (queues).
При звонке, клиент сначала прослушивает голосовое приветствие, потом его сервер соединяет со свободным оператором, и начинается общение. Но часто бывает, что при плохой связи – звонок обрывает. Клиенту приходится заново перезванивать, слушать опять голосовое приветствие (которое порой может длиться до полуминуты), и попадает на оператора… на другого оператора. Приходится заново рассказывать о своей проблеме другому оператору и решать все по новой. Порой “качество” связи (мобильной) может упасть на столько, что приходится перезванивать по 5-10 раз !!!
Поэтому было решено сделать так, что бы при обрыве, при повторном звонке, от одного и того же клиента – звонок шел без очереди на того же оператора, без голосовых приветсвий и т.д.
Решение
Решение оказалось довольно простым.
Будем использовать существующую базу Asterisk’а – CDR. В этой базе хранятся все записи и входящих и исходящих звонках нашего телефонного сервера.
Открываем файл /etc/asterisk/extensions.conf и правим нужный нам входящий канал. Добавляем такой блок:
При входящем звонке, соединяемся с базой, делаем запрос, на поиск в таблице cdr в поле clid по номеру водящего звонка (переменная %${CDR(src)} ) и время укажем последний текущий час (переменная ${STRF TIME(${EPOCH},,%Y-%m-%d %H)}%) в поле calldate. Если звонок “новый” и еще не звонил в течении часа, то запрос вернет пустое значение в переменную operator, и звонок перекинется на проигрывание приветствия, и звонок поступит в очередь операторов, где на него ответит свободный оператор.
Пример cmd asterisk:
-- Executing [100@local-phones:1] MYSQL("SIP/INPUT_MTS-0000006c", "Connect connid localhost aster password asterisk") in new stack
-- Executing [100@local-phones:2] MYSQL("SIP/INPUT_MTS-0000006c", "Query resultid 3 select dstchannel from cdr where clid like '%099xxxxxxx' and calldate like '2017-09-06 09%'") in new stack
-- Executing [100@local-phones:3] MYSQL("SIP/INPUT_MTS-0000006c", "Fetch fetchid 4 operator") in new stack
-- Executing [100@local-phones:4] GotoIf("SIP/INPUT_MTS-0000006c", "1?8:5") in new stack
-- Goto (local-phones,100,8)
-- Executing [100@local-phones:8] BackGround("SIP/INPUT_MTS-0000006c", "hello") in new stack
-- <INPUT_MTS-0000006c> Playing 'hello.slin' (language 'ru')
-- Executing [100@local-phones:9] Queue("SIP/INPUT_MTS-0000006c", "support") in new stack
-- Started music on hold, class 'default', on SIP/INPUT_MTS-0000006c
== Using SIP RTP CoS mark 5
-- SIP/971-0000006d is ringing
-- SIP/971-0000006d answered SIP/INPUT_MTS-0000006c
-- Stopped music on hold on SIP/INPUT_MTS-0000006c
Если же, клиент уже звонил и в базе cdr уже существует запись о том, что он звонил. Тогда в переменную operator вернется значение – SIP- номер оператора, с кем он разговаривал, и звонок уже вне очереди поступит напрямую к тому же оператору.
-- Executing [100@local-phones:1] MYSQL("SIP/INPUT_MTS-0000006a", "Connect connid localhost aster password asterisk") in new stack
-- Executing [100@local-phones:2] MYSQL("SIP/INPUT_MTS-0000006a", "Query resultid 1 select dstchannel from cdr where clid like '%099xxxxxxx' and calldate like '2017-09-06 09%'") in new stack
-- Executing [100@local-phones:3] MYSQL("SIP/INPUT_MTS-0000006a", "Fetch fetchid 2 operator") in new stack
-- Executing [100@local-phones:4] GotoIf("SIP/INPUT_MTS-0000006a", "0?8:5") in new stack
-- Goto (local-phones,100,5)
-- Executing [100@local-phones:5] MYSQL("SIP/INPUT_MTS-0000006a", "Clear 2") in new stack
-- Executing [100@local-phones:6] MYSQL("SIP/INPUT_MTS-0000006a", "Disconnect 1") in new stack
-- Executing [100@local-phones:7] Dial("SIP/INPUT_MTS-0000006a", "SIP/971,20,tT") in new stack
В интернете существует множество инструкций, о том как установить Linux на компьютер, как установить его с несколькими другими системами, как настроить определенные аспекты работы, как делать те или иные действия, но нет дельной статьи о том, как пользоваться Linux, какие действия и когда стоит выполнять, зачем это нужно и как все делать правильно.
Мы поговорим о настройке системы, безопасности, обновлениях, журналах, очистке, резервном копировании и других подобных вещах. Я не претендую на звание эксперта в этой области. Я так делаю в своей системе и предлагаю делать вам, но это всего лишь мое мнение, вы и другие пользователи могут считать по-другому. Статья использование linux ориентирована на обычных пользователей, а не системных администраторов и программистов. Но я думаю, что вы можете найти что-то полезное для себя в этой статье.
Протокол VRRP предназначен для увеличения доступности маршрутизаторов выполняющих роль шлюза по умолчанию.
VRRP (Virtual Router Redundancy Protocol) — сетевой протокол, предназначенный для увеличения доступности маршрутизаторов выполняющих роль шлюза по умолчанию. Это достигается путём объединения группы маршрутизаторов в один виртуальный маршрутизатор и назначения им общего IP-адреса, который и будет использоваться как шлюз по умолчанию для компьютеров в сети.
vrid – уникальный идентификатор виртуального роутера. На всех роутерах одного нода должен выставляться одинаковый
Так же есть параметр preemption-mode=yes если этот режим выключен: после того, как slave станет мастером, он им и останется, даже когда мастер вернется в строй.
Наименьший priority имеет VRRP Backup router(резервный) . По дефолту priority = 100.
Interface name on which VRRP instance will be running
vrid (integer: 1..255; Default: 1)
Virtual Router identifier. Each Virtual router must have unique id number
priority (integer: 1..254; Default: 100)
Priority of VRRP node used in Master election algorithm. Higher number means higher priority. ‘255’ is reserved to Router that owns VR IP and ‘0’ is reserved for Master router to indicate that it is releasing responsibility.
interval (integer: 1..255; Default: 1)
VRRP update interval in seconds. Defines how often master sends advertisement packets.
preemption-mode (yes|no; Default: yes)
Whether master node always has the priority. When set to ‘no’ backup node will not be elected to be a master until the current master fails, even if the backup node has higher priority than the current master. This setting is ignored if Owner routerbecomes available
authentication (ah,none,simple; Default: none)
Authentication method to use for VRRP advertisement packets.
none — should be used only in low security networks (e.g., two VRRP nodes on LAN).
ah — IP Authentication Header. This algorithm provides strong protection against configuration errors, replay attacks and packet corruption/modification. Recommended when there is limited control over the administration of nodes on a LAN.
simple — uses clear text password. Protects against accidental misconfiguration of routers on local network.
password (string; Default: )
Password required for authentication. Can be ignored if authentication is not used.
name (string; Default: )
VRRP interface name
on-backup (string; Default: )
Script to execute when the node switch to backup state
on-master (string; Default: )
Script to execute when the node switch to master state
К сожалению, на момент написания статьи, сама система Android (а также встроенные приложения от Google) не очень богата действительно востребованными функциями родительского контроля. Но кое-что можно настроить и не прибегая к сторонним приложениям.
Примечание: расположение функций указано для «чистого» Android. На некоторых устройствах с собственными лаунчерами настройки могут находиться в других местах и разделах (например, в «Дополнительно»).
Для самых маленьких — блокировка в приложении
Функция «Блокировка в приложении» позволяет запустить одно приложение на весь экран и запретить переключение на любое другое приложение или «рабочий стол» Android.
Чтобы использовать функцию, выполните следующее:
Зайдите в Настройки — Безопасность — Блокировка в приложении.
Включите опцию (предварительно прочитав о ее использовании).
Запустите нужное приложение и нажмите кнопку «Обзор» (квадратик), слегка потяните приложение вверх и нажмите по изображенной «Булавке».
В итоге, использование Android будет ограничено этим приложением, пока вы не отключите блокировку: для этого нажмите и удерживайте кнопки «Назад» и «Обзор».
Родительский контроль в Play Маркет
Google Play Маркет позволяет настроить родительский контроль для ограничения установки и покупки приложений.
Нажмите кнопку «Меню» в Play Маркет и откройте настройки.
Откройте пункт «Родительский контроль» и переведите его в положение «Вкл», задайте пин-код.
Установите ограничения по фильтрации Игр и приложений, Фильмов и Музыки по возрасту.
Чтобы запретить покупать платные приложения без ввода пароля учетной записи Google в настройках Play Маркет используйте пункт «Аутентификация при покупке».
Родительский контроль в YouTube
Настройки YouTube позволяют частично ограничить неприемлемые видео для ваших детей: в приложении YouTube нажмите по кнопке меню, выберите «Настройки» — «Общие» и включите пункт «Безопасный режим».
Также, в Google Play есть отдельное приложение от Google — «YouTube для детей», где этот параметр по умолчанию включен и его нельзя переключить обра