Перейти к содержанию

Редактирование файлов. Создание скриптов. Использования планировщика событий

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

Редактор файлов Nano

Текстовый редактор Nano входит в набор программ GNU и является стандартным консольным редактором для многих дистрибутивов Linux. Главное преимущество nano в простоте использования. Единственное отличие - редактор Nano полностью работает внутри терминала, что позволяет использовать его на удалённых машинах через ssh или telnet без графического интерфейса.

Команда запуска Nano имеет следующий синтаксис:

$ nano опции /адрес/файла/файл
#Например
$ nano -B config.txt

Использовать опции командной строки не обязательно, достаточно только указать имя файла, но в некоторых случаях опции могут быть очень полезны. Рассмотрим некоторые их них:

  • +номер - указать строку в файле, с которой нужно начинать редактирование;
  • -B - создавать резервную копию для файла при сохранении;
  • -D - выводить текст жирным;
  • -E - конвертировать табуляции в пробелы;
  • -F - включить поддержку редактирования нескольких файлов;
  • -H - сохранять историю поиска и замены;
  • -T - размер табуляции в пробелах;
  • -m - включить поддержку мыши;
  • -v - режим только для чтения, вы не можете сохранить файл.

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

Интерфейс программы nano интуитивен: в верхней части располагается строка состояния, в которой видно название файла, а снизу перечень основных команд. Символ & означает сочетание клавиши с Ctrl, например: Ctrl+X означает выход из программы.

nano1

Для перемещения по тексту вы можете использовать мышку (при использовании опции nano -m), стрелки на клавиатуре или специальные сочетания клавиш.

Основные комбинации клавиш:

  • Чтобы открыть более подробную информацию о сочетаниях клавиш нажмите Ctrl+G
  • Когда завершите работу с редактором и сохраните изменения нажмите Ctrl+X для выхода, если файл не был сохранен, программа предложит это сделать
  • Для сохранения изменений в файле используйте сочетание Ctrl+O. Если вы запустили nano без параметров, вам нужно будет ввести имя файла
  • Вы можете вставить содержимое другого файла на позицию курсора, для этого нажмите Ctrl+R и введите имя целевого файла
  • Для поиска по строке или регулярному выражению нажмите Ctrl+W
  • С помощью сочетания клавиш Alt+R вы можете использовать поиск и замену
  • Чтобы отменить последнее действие нажмите Alt+U
  • Повторить последнее действие еще раз вы можете с помощью Alt+E

Сочетания клавиш для навигации

  • Для перемещения по тексту можно использовать клавиши PageUP, PageDown, Home, End и клавиши со стрелками
  • Для перемещения в начало строки используйте Ctrl+A, а в конец - Ctrl+E.
  • Для перемещения по страницам: Ctrl+V перемещает на страницу вниз, а Ctrl+Y - на страницу вверх.
  • Чтобы посмотреть где сейчас находится курсор, нажмите Ctrl+C.

Копирование вырезание и вставка

  • Чтобы выделить участок текста нажмите Ctrl+^ переместите курсор к концу нужного участка и опять нажмите это же сочетание клавиш. Весь текст между начальной и конечной точкой не включая позицию курсора будет выделен и вы можете его скопировать или вырезать.
  • Для копирования выделенного текста нажмите Alt+^, а чтобы его вырезать - Ctrl+K.
  • Чтобы вставить вырезанный текст переместите курсор на нужную позицию и нажмите Ctrl+U.
  • Чтобы вырезать всю строку текста достаточно нажать Ctrl+K, иногда это очень удобно при редактировании файлов конфигурации.

Введение в разработку сценариев (написание скриптов)

Командные оболочки, такие как bash, поддерживают программные конструкции, которые могут быть сохранены в форме сценариев. Эти сценарии, в свою очередь, впоследствии могут использоваться в качестве реализаций дополнительных команд командной оболочки. Многие команды Linux реализованы в форме сценариев. Например, сценарии для обслуживания профиля пользователя исполняются при входе пользователя в систему, а сценарии инициализации - при остановке и запуске служб.

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

По аналогии с практически любым курсом по программированию, мы начнем работу с разработки сценария hello_world. Это алгоритм, выводящий на экран приветственную строку Hello World. Для этого в bash имеется соответствующая команда echo

echo Hello World

А для того, чтобы присвоить текстовому файлу право быть исполняемым, используется команда chmod с опцией +x.

chmod +x hello_world

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

[paul@RHEL4a ~]$ nano hello_world
[paul@RHEL4a ~]$ chmod +x hello_world 
[paul@RHEL4a ~]$ ./hello_world 
Hello World
[paul@RHEL4a ~]$

Комментарии

В bash скриптах есть возможность писать комментарии с помощью символа #. Принято в первой строке указывать имя используемого интерпретатора для скрипта, в данном случае - /bin/bash. Эта строка комментария называется shebang и используется, как правило, всегда.

#!/bin/bash
#
# Сценарий программы Hello World
#
echo "Hello World"

Переменные

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

#!/bin/bash
#
# простая переменная в сценарие
var1=4
echo "var1 = $var1"

Переменные внутри программы изолированы от внешней среды и недоступны в терминале после выполнения.

[paul@RHEL4a ~]$ echo $var1

#(пустая строчка)
[paul@RHEL4a ~]$ ./vars
var1 = 4
[paul@RHEL4a ~]$ echo $var1

#(пустая строчка)
[paul@RHEL4a ~]$

Кавычки

Внимательно стоит относиться к кавычкам в bash-скриптах. Одиночные кавычки \ полностью интерпретируются, как текст, а двойные " позволяют выводить внутри них текст.

#!/bin/bash

var1=4
echo 'var1 = $var1' #выведет var1 = $var1
echo "var1 = $var1" #выведет var1 = 4

Команда test

Команда test позволяет установить, является ли какое-либо выражение истинным или ложным. Например, используя опцию -gt для сравнения двух чисел (10 greater than 55).

[paul@RHEL4b ~]$ test 10 -gt 55 ; echo $?
1
[paul@RHEL4b ~]$

Стоит заметить, что результат мы вывели, используя echo $. В переменной $ хранится результат выполнения последней команды.

Можно использовать команду test таким образом, как показано ниже. Такая конструкция из операторов И, ИЛИ позволяет сокращенно писать условия if-else

[paul@RHEL4b ~]$ test 56 -gt 55 && echo true || echo false
true
[paul@RHEL4b ~]$ test 6 -gt 55 && echo true || echo false
false

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

[paul@RHEL4b ~]$ [ 56 -gt 55 ] && echo true || echo false
true
[paul@RHEL4b ~]$ [ 6 -gt 55 ] && echo true || echo false
false

Ниже приведены примеры реализаций некоторых проверок. Обратитесь к странице руководства man test для ознакомления с дополнительными возможностями реализации различных проверок.

[ -d foo ]           Существует ли директория foo ?
[ -e bar ]           Существует ли файл bar ?
[ '/etc' = $PWD ]    Эквивалентна ли строка /etc значению переменной $PWD ?
[ $1 != 'secret' ]   Отличается ли значение первого параметра сценария от строки secret ?
[ 55 -lt $bar ]      Меньше ли целочисленное значение 55 значения переменной $bar ?
[ $foo -ge 1000 ]    Является ли значение переменной $foo большим или равным целочисленному значению 1000 ?
[ "abc" < $bar ]     Будет ли строка abc расположена выше значения переменной $bar в списке после сортировки ?
[ -f foo ]           Является ли foo обычным файлом ?
[ -r bar ]           Является ли bar читаемым файлом ?
[ foo -nt bar ]      Новее ли файл foo файла bar ?
[ -o nounset ]       Активирован ли параметр командной оболочки nounset ?

Операторы проверок могут комбинироваться с операторами, соответствующими логическим операциям "И" и "ИЛИ".

paul@RHEL4b:~$ [ 66 -gt 55 -a 66 -lt 500 ] && echo true || echo false
true
paul@RHEL4b:~$ [ 66 -gt 55 -a 660 -lt 500 ] && echo true || echo false
false
paul@RHEL4b:~$ [ 66 -gt 55 -o 660 -lt 500 ] && echo true || echo false
true

Конструкция условия if then else

Конструкция if then else предназначена для выбора варианта кода. В том случае, если определенное условие выполняется, будет исполняться какой либо код, в противном случае будет исполняться какой-либо другой код. В примере ниже осуществляется проверка существования файла, после чего в том случае, если предположение о существовании файла подтверждается, осуществляется вывод соответствующего сообщения.

#!/bin/bash

if [ -f isit.txt ]
then echo файл isit.txt существует!
else echo файл isit.txt не найден!
fi

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

[paul@RHEL4a scripts]$ ./choice 
файл isit.txt не найден!
[paul@RHEL4a scripts]$ touch isit.txt #создание файла isit.txt
[paul@RHEL4a scripts]$ ./choice 
файл isit.txt существует!
[paul@RHEL4a scripts]$

Условный переход if then elif

Команда if then else так же может быть расширена последовательным выполнением инструкций if, else if, else if - которая в bash выглядит как elif

#!/bin/bash
count=42
if [ $count -eq 42 ]
then
  echo "42 является корректным значением."
elif [ $count -gt 42 ]
then
  echo "Меньше 42"
else
  echo "Больше 42"
fi

Цикл for

В примере ниже представлен синтаксис классического цикла for в командной оболочке bash.

for i in 1 2 4
do
   echo $i
done

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

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

#!/bin/bash
for counter in {1..20}
do
   echo отсчет от 1 до 20, текущее значение $counter
   sleep 1
done

Цикл while

Ниже приведен простой пример использования цикла while.

i=100;
while [ $i -ge 0 ] ;
do
   echo Обратный отсчет от 100 до 0, текущее значение $i;
   let i--;
done

Бесконечные циклы могут реализовываться с помощью объявлений while trueили while :, где символ : является эквивалентом отсутствующей операции в командных оболочках Korn shell и bash.

#!/bin/ksh
# бесконечный цикл
while :
do
 echo hello
 sleep 1
done

Цикл do until

Ниже приведен простой пример использования цикла until.

let i=100;
until [ $i -le 0 ] ;
do
   echo Обратный отсчет от 100 до 1, текущее значение $i;
   let i--;
done

Параметры сценария

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

#!/bin/bash
echo Первым аргументом является $1
echo Вторым аргументом является $2
echo Третьим аргументом является $3
echo \$ $$  - идентификатор процесса (PID) интерпретатора сценария
echo \# $#  - количество аргументов
echo \? $?  - последний код завершения процесса
echo \* $*  - строковое представление всех аргументов

Ниже представлен вывод данного сценария.

[paul@RHEL4a scripts]$ ./pars one two three
Первым аргументом является one
Вторым аргументом является two
Третьим аргументом является three
$ 5610 - идентификатор процесса (PID) интерпретатора сценария
# 3  - количество аргументов
? 0  - последний код завершения процесса
* one two three - строковое представление всех аргументов

Еще один вариант исполнения данного сценария, но теперь с передачей только двух параметров.

[paul@RHEL4a scripts]$ ./pars 1 2
Первым аргументом является 1
Вторым аргументом является 2
Третьим аргументом является
$ 5612 - идентификатор процесса (PID) интерпретатора сценария
# 2 - количество аргументов
? 0 - последний код завершения процесса
* 1 2 - строковое представление всех аргументов
[paul@RHEL4a scripts]$

А это другой пример сценария, в котором мы используем параметр $0. Параметр $0 содержит имя файла исполняющегося сценария.

paul@debian6~$ cat myname 
echo имя файла этого сценария $0
paul@debian6~$ ./myname 
имя файла этого сценария ./myname
paul@debian6~$ mv myname test42
paul@debian6~$ ./test42 
имя файла этого сценария ./test42

Обход списка параметров

Оператор обхода списка параметров (shift) позволяет произвести разбор всех переданных сценарию параметров по очереди. Ниже представлен пример сценария с данным оператором.

kahlan@solexp11$ cat shift.ksh 
#!/bin/ksh                                

if [ "$#" == "0" ] 
 then
  echo Вы должны передать по крайней мере один параметр сценарию.
  exit 1
fi

while (( $# ))
 do
  echo Вы передали сценарию параметр $1
  shift
 done

А это вариант вывода приведенного выше сценария.

kahlan@solexp11$ ./shift.ksh one  
Вы передали сценарию параметр one
kahlan@solexp11$ ./shift.ksh one two three 1201 "33 42"
Вы передали сценарию параметр one                           
Вы передали сценарию параметр two
Вы передали сценарию параметр three
Вы передали сценарию параметр 1201
Вы передали сценарию параметр 33 42
kahlan@solexp11$ ./shift.ksh
Вы должны передать по крайней мере один параметр сценарию.

Ввод в процессе исполнения сценария

Вы можете попросить пользователя ввести данные, воспользовавшись командой read в сценарии.

#!/bin/bash
echo -n Введите число:
read number

Планировщики событий

При работе с ОС Linux часто возникают задачи автоматизации выполнения каких-то одноразовых или регулярных рутинных действий по заданному расписанию (выполнение определённого действия в указанное время или через какой-либо промежуток времени и пр.). Для этих целей могут применяться, в частности, служба at (для одноразовых задач) и служба cron (для регулярных задач).

Общесистемные файлы конфигурации расписаний запуска службы cron располагаются в /etc/crontab и в файлах каталога /etc/cron.d. Файлы с настройками расписания запуска заданных пользователем задач обычно располагаются в каталоге /var/spool/cron.

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

Формат общесистемного расписания:

# Установка переменных окружения 
name = value 
# Строка расписания 
mm hh DD MM DW user cmd [arg...] 

Формат пользовательского расписания:

# Установка переменных окружения 
name = value 
# Строка расписания 
mm hh DD MM DW cmd [arg...] 

Здесь mm hh DD MM DW — время выполнения в формате минута, час, день месяца, месяц, день недели; cmd [arg...] — задаваемая для запуска команда с аргументами. При задании полей времени можно использовать регулярные выражения, а в командах — переменные окружения (LOGNAME, HOME, SHELL и т.п.).

Для просмотра имеющихся у пользователя задач используется:

crontab -u username -l

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

crontab -u username -e

Вы можете удалить все существующие задачи командой -r:

crontab -r

Давайте предположим, что нам нужно запускать от имени суперпользователя наш скрипт по адресу /usr/local/bin/serve. Какой-нибудь обслуживающий скрипт. Самый простой пример - запускать его каждую минуту:

* * * * * /usr/local/bin/serve

Далее, усложним, будем запускать каждый час, в нулевую минуту:

0 * * * * /usr/local/bin/serve

Еще дальше:

Запускаем в нулевую минуту нулевого часа, каждый день, это в 12 ночи: 0 0 * * * /usr/local/bin/serve

Если идти так дальше, то можно запускать в первый день каждого месяца:

0 0 1 * * /usr/local/bin/serve

Можно продолжать бесконечно, попробуйте сделать сами.

Для однократного запуска задачи в заданное время используется демон atd. Синтаксис:

at <время> [дата] команды 

Время задаётся в АМ/РМ-формате (например, для выполнения задачи в 14:00 необходимо задать at 2pm или at 14:00). Для завершения ввода необходимо нажать комбинацию клавиш Ctrl + d .

Для просмотра задач atd используется команда atq, для отмены выполнения задачи — команда atrm


  • Запустите терминал
  • Создайте скрип, который будет выводить фразу "hello world". Для этого создайте новый файл с названием hello_world
  • Первая строка должна состоять из символов "#", "!" и пути к интерпретатору /bin/bash
  • Для вывода в терминал строки "hello world" с помощью написанного скрипта необходимо использовать команду "echo" и передать ей строку "hello world"
  • Сохраните изменения и закройте редактор. Файл будет сохранен в домашней директории пользователя.
  • Убедитесь в наличии созданного файла hello_world в домашней директории
  • Попробуйте запустить скрипт. Запуск программы или скрипта в текущей директории осуществляется введением команды ./<название_программы>
  • Необходимо сделать файл исполняемым, иначе при попытке его запуска будет выведено сообщение, что пользователю отказано в доступе. Чтобы изменить права доступа и сделать файл исполняемым, нужно ввести команду chmod +x <название_файла>
  • Выведите в терминал список файлов, содержащихся в домашней директории, с указанием прав доступа к файлам: ls -l
  • По выведенным данным видно, что файл hello_world стал исполняемым ("-rwxrwxr-x"). Попробуйте запустить скрипт

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

  • Запустите терминал и получите полномочия администратора
  • Используйте предыдущий скрипт и переделайте его так, чтобы он выводил текущее время на экран
  • Посмотрите статус демона crond: systemctl status crond
  • Посмотрите содержимое файла конфигурации /etc/crontab
  • Откройте файл расписания на редактирование: crontab -e
  • Команда запустит интерфейс редактора, выберите nano [1]
  • Сделайте так, чтобы ваш скрипт запускался каждую минуту
  • Закройте сеанс редактирования nano и сохраните изменения
  • Посмотрите список заданий в расписании: crontab -l
  • Проверьте, работает ли запланированное событие