Автоматизация работы. команда at.
Команда at обычно работает интерактивно, то есть вы сначала вызываете программу, указав время, когда задание должно выполниться, затем вводите свои команды и нажимаете Ctrl+D, чтобы сохранить задание. Вот пример «диалога» с at:
user@user:~$ at midnight
at> du / > ~/diskusage
at <EOT>
job 1 at 2007-02-13 00:00
В первой строке запускаем at и указываю полночь (midnight) как время старта для задания. При этом at запустится, и появится приглашение at>, показывающее, что можно вводить содержимое задания. Задание, которое мы хотим выполнить в полночь – выяснить, сколько дискового пространства используется на моём компьютере, так что запускаем du и перенаправляем её вывод в файл в домашнем каталоге. <EOT> – это Ctrl+D, что приводит к сохранению задания, выводу его номера и сообщению, когда оно будет выполнено (сегодня в полночь). Узнать, какие задания уже поставлены в очередь, вы можете, набрав atq.
– 1 2007-02-13 00:00 a user
В Linux можно выбрать много очередей заданий, и чем дальше буква от начала алфавита, тем ниже
приоритет. Очередь «a» имеет наивысший приоритет, и будет исполнена с нормальным для пользователя значением nice (то есть так быстро, как только сможет).
Удалить задание: atrm N (N-номер задания)
Есть несколько способов указать время в at, и midnight – лишь один из них. Из предопределённых есть tomorrow (завтра), noon (полдень) и teatime (4 часа вечера), но вы можете указывать и точное время, например, 16:00 (те же 4 вечера) или комбинировать эти значения (16:00 tomorrow). Простейший способ – указывать
относительное время, используя now (сейчас), например, так: at now + 5 minutes
КОМАНДА BATCH
Если время выполнения для вас не имеет значения, используйте batch. Различие заключается в том, что batch начнёт выполнять ваши задания сразу же, как только загрузка системы опустится ниже 0,8 (т.е. машина будет не слишком занята). Синтаксис намного проще, поскольку не нужно указывать время: просто наберите batch, нажмите Enter, добавьте свои команды и нажмите Ctrl+D, чтобы сохранить задание. Введя atq, вы увидите ваше задание в очереди «B», что означает запуск с более низким приоритетом, чем у других заданий и большинства программ в системе. По этой причине ваше задание стартует только тогда, когда система бездействует, но, если оно запустится, а в следующую секунду машину потребует другая работа, ваше задание тихонько переберется в фоновый режим и отдаст ресурсы процессора. Оно не останавливается, но из-за более низкого приоритета получит намного меньше процессорного времени.
За команды at и batch отвечает демон atd. При его запуске мы можем задать параметр загруженности системы, при котором нужно запускать выполнение задания. По умолчанию он равен 0.8
Синтаксис atd –l –b –d –s
-l Минимальный фактор загрузки
-b Минимальный интервал, в секундах, между запуском двух пакетных заданий (по умолчанию 60).
-d Отладка; выводит сообщения об ошибках на стандартный поток ошибок
-s Эта опция используется для совместимости со старыми версиями at
ПОМЕЩЕНИЕ ЗАДАНИЙ В ФАЙЛЫ.
Если вы хотите, чтобы at или batch читали ваши задания из файла, просто используйте -f имяфайла перед указанием времени, например, так:
– at -f myjob.job tomorrow – batch -f myjob.job
ПРОГРАММИРОВАНИЕ В ОПЕРАЦИОННОЙ СРЕДЕ.
ПЕРЕМЕННЫЕ СРЕДЫ.
Системные переменные определяются и хранятся в окружении родительского процессора. Они также называются переменными окружения. Имена этих переменных состоят из заглавных букв, и могут быть показаны командой 'set'. Примерами системных переменных являются PWD, HOME, USER. Значения этих системных переменных могут быть показаны по отдельности командой 'echo'. Например, 'echo $HOME' выведет значение, хранящееся в системной переменной HOME • Когда устанавливаете системную переменную, не забудьте использовать команду 'export', чтобы сделать ее доступной дочерним процессорам (любые процессоры, которые запущены из текущего, включая сценарии): bash$ SCRIPT_PATH=/home/blessen/shellscript bash$ export SCRIPT_PATH • Современные командные процессоры также позволяют сделать это одной командой: bash$ export SCRIPT_PATH=/home/blessen/shellscript
СЦЕНАРИИ.
Наборы команд могут компоноваться в командные файлы, называемые скриптами, где в первой строке в специального вида комментарии указывается командный интерпретатор для исполнения этого набора.
• Все сценарии должны начинаться со строки "#!/bin/bash" или с указания любого другого процессора, который вы предпочитаете • Эта строка называется shebang • Она уведомляет оболочку о том, какой командный процессор должен использоваться • сделать сценарий исполняемым, используя команду "chmod"
РОЛЬ И ВЛИЯНИЕ
Кроме того, что каждый пользователь стремится по максимуму автоматизировать выполняемую им работу с помощью сценариев shell, так и сценарии инициализации системы и множества приложений есть ничто иное как просто сценарии shell. Одно из фундаментальных изменений в подходе к программированию за последние 15 лет связано с переходом от традиционных языков программирования систем, таких как Си или С++, к языкам описания сценариев наподобие Perl или Tcl. Языки сценариев предназначаются для иных задач, нежели языки программирования систем, а потому фундаментально отличаются от них. Языки сценариев создавались для "склеивания" мощных готовых компонентов в предположении, что большинство из них уже существует и надо лишь связать их между собой.
ВЫПОЛНЕНИЕ СЦЕНАРИЯ
• Это может быть сделано вводом имени сценария в командную строку с указанием его пути • Если сценарий находится в текущей директории, это очень просто: bash$ ./firstshellscript.sh • Если вы хотите увидеть выполнение пошагово, что очень полезно для отладки - тогда выполните сценарий с опцией '-x' (что означает 'раскрыть аргументы'): sh -x firstshellscript.sh • В сценариях командного процессора все строки, начинающиеся с #, являются комментариями. • Многострочные комментарии: двоеточие и одинарные кавычки
АРГУМЕНТЫ КОМАНДНОЙ СТРОКИ
Это переменные, которые содержат аргументы выполняемого сценария. Доступ к этим переменным может быть получен через имена $1, $2, ... $n, где $1 первый аргумент командной строки, $2 второй, и так далее. Аргументы располагаются после имени сценария и разделены пробелами. Переменная $0 - это имя сценария. Переменная $# хранит количество аргументов командной строки, это количество ограничено 9 аргументами в старых шеллах и практически неограниченно в современных.
КОД ВОЗВРАТА
• Эта переменная сообщает нам, была ли последняя команда успешно выполнена. Она обозначается $?. Нулевое значение означает, что команда была успешно выполнена • Любые другие числа означают, что команда была выполнена с ошибкой (также некоторые программы, такие как 'mail', используют ненулевое значение возврата для отображения состояния, а не ошибки)
ОБЛАСТЬ ВИДИМОСТИ
• При написании сценариев процессоров видимость переменных используется для различных задач • В процессорах есть два типа видимости: глобальная и локальная • Локальные переменные определяются, используя ключевое слово "local" перед именем переменной, все остальные переменные, кроме связанных с аргументами функции, - глобальные, и поэтому доступны из любого места сценария
ВВОД-ВЫВОД В СЦЕНАРИЯХ
• Для ввода с клавиатуры используется команда 'read'. Эта команда считает значения, набранные на клавиатуре, и присвоит каждое определенной переменной. • Для вывода используется команда 'echo'.
АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ:sum=`expr 12 + 20` echo $[12 + 10] echo $(12 + 10)
ОПЕРАТОР УСЛОВИЯ
if [ "$username" = "blessen" ]
then
echo 'Успешно!!! Вы зашли.'
else
echo 'Извините, неправильное имя пользователя.'
fi
СРАВНЕНИЕ ПЕРЕМЕННЫХ
-eq Равно -ne Не равно -lt Меньше -le Меньше или равно -gt Больше -ge Больше или равно
• Если переменные являются строками, вы должны использовать эти опции:
– = Равно – != Не равно – < Первая строка отсортирована перед второй – > 1я строка отсортирована после 2й
ЦИКЛЫ
for ((<начальное значение>; <условие>; <инкремент/декремент>)) do … done | num=1 while [$num –lt 5] do num=$[$num + 1]; echo $num; done |
SELECT, CASE
select <переменная> in <список> do <любые выражения или операторы> done | case $<переменная> in <выбор1>) <любые выражения или операторы> ;; <выбор2>) <любые выражения или операторы> ;; *) echo "Извините, неправильный выбор" ;; esac |
ОТВЕТЫ НА ВОПРОСЫ:
9.Какие недостатки несёт интерпретация сценариев? Занимает больше времени (компиляция выполняется один раз, интерпретация каждый раз при обращении к коду) Преимущества: переносимость с одного железа на другое
10. Почему в сценариях не реализуется поддержка чисел с плавающей запятой? - Стандартная командная оболочка POSIX - sh их не поддерживает, так как она направлена на написание системных сценариев, и если была бы поддержка чисел с плавающей запятой, это бы сильно усложнило интерпретаторы
11. Как ускорить работу, выполняемую сценарием? Улучшить код, дать ему больший приоритет, написать его не как сценарий, а как программу, так как в этом случае скомпилируется весь код и потом запустится, так быстрее.