Скрипты и планировщик задач в ОС Linux
В данном посте обсуждаются базовые принципы написания скриптов и работа планировщика заданий в Oracle Linux. Рассматриваются следующие вопросы:
1. Скрипты в ОС Linux
Скрипты в ОС на базе Linux – это набор команд, записанных в файл. Это делается с целью быстрого и удобного вызова последовательности этих команд. Скрипты могут выполнять самые разные задачи – от автоматизации рутинных действий системного администратора до реализации сложных алгоритмов для ИТ инфраструктуры. При этом результаты работы команд могут служить входными данными для других задач (команд).
Для того, чтобы превратить файл с набором команд в скрипт, понадобятся две вещи. Во-первых, в первой строке пустого файла необходимо прописать путь к командной оболочке, которая будет исполнять данный файл. В большинстве дистрибутивов Linux данной оболочкой является Bash, и соответственно первой строкой будет #!/bin/bash. В других строках символ решетки используется для обозначения комментариев, которые не будут обработаны оболочкой. Однако, первая строка — это особый случай, здесь решетка, за которой следует восклицательный знак (эту последовательность называют шебанг) и путь /bin/bash, указывают системе что данный скрипт создан именно для оболочки bash. Во вторых, чтобы скрипт запустить как исполняемый файл, ему необходимо дать права на исполнение, иначе, попытка его запуска даст ошибку Permission denied.
Пример ошибки, когда запускается неисполняемый файл:
[rustam@dushanbe ~]$ ./filename.sh -bash: ./filename.sh: Permission denied
Права на исполнение даются командой chmod. Например,
chmod +x filename.sh
Данная команда дает всем пользователям операционной системы право на запуск файла с именем filename.sh
Право на запуск того же файла только владельцу можно дать следующей командой: chmod u+x filename.sh.
Расширение .sh не обязательно, но таким образом легче определять, какой файл является скриптом.
Ниже рассматривается пример написания простейшего скрипта, копирующего все файлы из папки /home/rustam/Documents в папку /tmp/backup.
#!/bin/bash # Скрипт копирует файлы в папку /tmp/backup/ echo “Сейчас начнется копирование…” cp /home/rustam/Documents/* /tmp/backup/
При работе со скриптами могут использоваться переменные. Они позволяют хранить в файле сценария различную информацию, например, результаты работы одних команд для дальнейшего их использования для других команд.
Исполнение отдельных команд без хранения результатов работы ограничивают их возможности.
Существуют два типа переменных, которые используются в bash-скриптах:
Используются при необходимости работы с системными данными в командах оболочки. Например, требуется вывести домашнюю директорию текущего пользователя. Список переменных для среды конкретного пользователя выдается командой env.
echo "Home for the current user is: $HOME"
Можно использовать системную переменную $HOME в двойных кавычках, что не помешает ее распознаванию системой.
В дополнение к переменным среды, bash-скрипты позволяют задавать и использовать в скрипте свои собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария. Как и в случае с системными переменными, к пользовательским переменным обращаются используя знак доллара:
#!/bin/bash age=34 name="Rustam" echo "$name is $age years old"
Дополним соответствующим образом скрипт, написанный ранее – добавляется переменная для хранения пути к папке, в которую осуществляется копирование.
#!/bin/bash # Скрипт копирует файлы в папку /tmp/backup/ # В переменной dest_dir хранится путь к папке, который подставляется в команду ниже dest_dir="/tmp/backup/" echo “Сейчас начнется копирование…” cp /home/rustam/Documents/* $dest_dr
2. Что такое планировщик заданий. Работа сервиса cron.
Часто возникают ситуации, в которых приходится автоматизировать различные задачи по обслуживанию и работе с Linux с помощью скриптов. В этом случае удобно, если скрипт выполняет необходимые команды без участия пользователя. Для этого настраивается автоматический запуск требуемого скрипта в заданное время.
Для указанной настройки в Linux используется системный сервис cron. Это планировщик, который позволяет выполнять необходимые скрипты раз в час, раз в день, неделю или месяц, а также в любое заданное время или через любой интервал времени. Сервис cron также часто используется другими службами операционной системы.
Как и большинство других сервисов Linux, cron запускается при старте системы и работает в фоновом режиме. Его основная задача – выполнять требуемые процессы в заданное время. Существует несколько конфигурационных файлов, из которых берется информация о том, что и когда нужно выполнять. Cron открывает файл /etc/crontab, в котором указываются необходимые данные.
Для настройки времени, даты и интервала выполнения задания, используется специальный синтаксис файла cron и специальная команда. Не рекомендуется непосредственно редактировать файл /etc/crontab. Вместо этого используется команда crontab. Ниже запускается команда crontab с ключом –e для редактирования файла
Рекомендуется ее выполнять с опцией -e, тогда для редактирования правил используется текстовый редактор по умолчанию. После выполнения команды открывается временный файл, в котором записаны текущие правила cron и есть возможность добавлять новые. Добавленные правила запускаются именно от того пользователя, от имени которого они были добавлены.
Файлы crontab, используемые для управления работой планировщика, располагаются в каталоге /etc/cron.d/. Кроме того, в каталогах /etc/cron.daily/, /etc/cron.weekly/ и /etc/cron.monthly/ размещаются автоматически запускаемые программы (ежедневно, еженедельно или ежемесячно).
Вывод содержимого текущего файла позволяет команда:
Таблица crontab состоит из 6 колонок, которые разделяются пробелами или табуляторами. Первые пять колонок отвечают за время выполнения, соответственно, минута, час, день месяца, месяц, день недели. В них может находиться: число, список чисел (1,2,3), диапазон чисел (1-3), символы * или /. Все остальные символы в строке интерпретируются как выполняемая команда с ее параметрами – можно указать как саму команду (например, echo “Доброе утро”), так и путь к исполняемому скрипту.
Как запускать скрипты через cron
Скрипты запускаются через cron, указанием команды либо пути к скрипту в последней колонке.
Обязательно требуется прописывать полный путь к команде, так как для команд, запускаемых от имени сервиса cron, переменная пользовательской среды PATH будет отличаться, и сервис не сможет найти команду.
Пример запуска ранее созданного скрипта filename.sh, который копирует файлы каждый день в 23:00:
0 23 * * * /home/rustam/filename.sh
или копирует файлы каждые 5 минут:
0 23 * * * /home/rustam/filename.sh
3. Примеры
Ниже приведены примеры настройки и работы cron:
0 17 * * 1-5 echo “Рабочий день закончен – эта надпись выводится в 17:00 с понедельника по пятницу”
15 6 * * sun echo “Выполняется в 6:15 в воскресенье”
30 12,13 * * 1,3 echo “Эта надпись выводится в понедельник и среду в 12:30 и 13:30”
0-59 * * * * echo “Выполняется ежеминутно”
Oracle Shell Scripting
This article presents some basic techniques for creating Windows batch files and UNIX/Linux shell scripts that connect to SQL*Plus and RMAN.
Windows
To run a SQL script using SQL*Plus, place the SQL along with any SQL*Plus commands in a file and save it on your operating system. For example, save the following script in a file called «C:\emp.sql».
CONNECT scott/tiger SPOOL C:\emp.lst SET LINESIZE 100 SET PAGESIZE 50 SELECT * FROM emp; SPOOL OFF EXIT;
Next, create a batch file called «C:\get_emp.bat» containing the following command.
The resulting batch file can be run manually, by double-clicking on it, or scheduled using the Scheduled Tasks Wizard (Start > Programs > Accessories > System Tools > Scheduled Tasks) or the AT scheduler.
The method is very similar when using Recovery Manager (RMAN). As an example, place the following RMAN commands in a file called «C:\cmdfile.txt».
Next create a batch file called «C:\backup.bat» containing the following command.
This command can include a catalog= entry if a recovery catalog is used. Once again, resulting batch file can be run manually or scheduled.
Powershell
Powershell allows file redirection similar to UNIX/Linux shell scripting, so we can do something like the following for SQL*Plus.
@" CONNECT scott/tiger SPOOL /u01/emp.lst SET LINESIZE 100 SET PAGESIZE 50 SELECT * FROM emp; SPOOL OFF EXIT; "@ | sqlplus.exe /nolog
The following example works for RMAN.
UNIX and Linux (Method 1)
The previous methods works equally well in UNIX and Linux environments. For example, save the following script in a file called «/u01/emp.sql».
CONNECT scott/tiger SPOOL /u01/emp.lst SET LINESIZE 100 SET PAGESIZE 50 SELECT * FROM emp; SPOOL OFF EXIT;
Next, create a shell script called «/u01/get_emp.ksh» containing the following lines.
#!/bin/ksh sqlplus /nolog @/u01/emp.sql
The following command makes the file executable for the file owner.
The resulting shell script can be run manually from the command line, or scheduled using CRON.
For RMAN, place the following RMAN commands in a file called «/u01/cmdfile.txt».
Next create a batch file called «/u01/backup.ksh» containing the following lines.
#!/bin/ksh rman target=/ @/u01/cmdfile.txt
This command can include a catalog= entry if a recovery catalog is used. Once again, resulting shell script must be made executable using the following command.
The shell script is now ready to run.
UNIX and Linux (Method 2)
UNIX and Linux environments also allow the SQL*Plus and RMAN commands to be piped directly from the command line. For example, save the following commands in a file called «/u01/get_emp.ksh».
The shell script is ready to be run manually from the command line or scheduled using CRON.
The following example shows how RMAN can use the same method. Create a file called «/u01/backup.ksh» with the following contents.
#!/bin/ksh rman target=/ EXIT; EOF
Once again, the script can be made executable using the following command.
The shell script is now ready to run.
UNIX and Linux (Returning values from SQL)
The following code show a script to pull the output of a query into a shell script variable.
#!/bin/bash RETVAL=`sqlplus -silent scott/tigerIf you are returning a single value, this method works well. If you are returning multiple rows of multiple columns it gets a bit messy and forces you to parse the return value.
Checking the Database is Up
It is sometimes necessary to check the database is up before performing a task. In the following example, we check the database is up before starting a Tomcat application server. If the database is down, the script sleeps for 5 minutes, then checks again.
The script requires an Oracle Client to make connections to the database. This could be a full client installation, or an Oracle Instant Client installation.
Create a script called "check_db.sh" will the following contents. This is the script that will check if the database is up or not.
# Environment variables necessary for Oracle Instant Client export LD_LIBRARY_PATH=/home/tomcat/scripts/instantclient_11_2 export PATH=$PATH:$LD_LIBRARY_PATH function check_dbNext, create a script called "tomcat_start_dev.sh" with the following contents.
scriptPath=$ source $scriptPath/check_db.sh CONNECTION="up_check_user/password@//hostname:1523/service" echo "Wait until DB is up" check_db $CONNECTION while [ $DB_OK = 1 ] do echo "DB not up yet. Sleeping for 5 mins (CTRL+C to exit)" sleep 300 check_db $CONNECTION done echo "Starting" echo "DEV: /u01/dev" /u01/dev/bin/tomcat startThis sources the "check_db.sh" script, so it is included as if it were part of this script. It could be combined, but this allows the "check_db.sh" script to be shared by multiple scripts. The "tomcat_start_dev.sh" script loops round, checking to see if the DB is up. Once it is up, it falls through to the Tomcat start command.
Hope this helps. Regards Tim.
Created: 2005-12-14 Updated: 2018-05-01