Автоматизация работы. команда 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. Как ускорить работу, выполняемую сценарием? Улучшить код, дать ему больший приоритет, написать его не как сценарий, а как программу, так как в этом случае скомпилируется весь код и потом запустится, так быстрее.

Наши рекомендации