Операционные системы и программное обеспечение на платформе zSeries

Управление заданиями и язык JCL

Разбить на страницы
Показывать лекцию целиком

Понятие задания

В п. 5.1.1 мы определили задание (job) как внешнюю единицу работы z/OS. Это означает, что пользователь может запросить у системы выполнение какой-либо работы (конечно, связанной с запуском определенных приложений) с помощью специальным образом записанного и переданного системе текста. Это и есть задание. Задания составляются на языке управления заданиями JCL (Job Control Language) и направляются в систему пользователями через входные устройства и сетевые коммуникации, а также через ранее запущенные приложения. В задании зашифровано, какие программы, в какой последовательности и с какими данными должны быть исполнены, а также в какой форме и куда должны быть направлены результаты выполнения программ.

Все множество заданий в z/OS может быть представлено в виде трех групп:

  • пакетные задания (batch job), формируемые пользователями на языке JCL и направляемые на обработку по команде сеанса TSO SUBMIT или через сетевые интерфейсы.
  • STC-задания, инициируемые с помощью консольных команд START и MOUNT и получившие название запускаемые процедуры (started task);
  • TSU-задания, формируемые в результате запуска пользовательских сеансов TSO/E по команде LOGON и предназначенные для поддержки диалога с пользователем.
  • Задания, поступающие в систему от различных источников, образуют поток заданий, обрабатываемый специальным системным компонентом JES.

    При выполнении STC и TSU заданий z/OS создает отдельные адресные пространства для каждой запускаемой процедуры и каждого пользовательского сеанса TSO. Для пакетных заданий новые адресные пространства не создаются, поскольку их выполнение производится в системных адресных пространствах программ-инициаторов, входящих в состав JES.

    Каждое задание характеризуется набором атрибутов, среди которых необходимо выделить:

  • имя (jobname);
  • идентификатор (jobID);
  • класс выполнения или просто класс (class);
  • приоритет (prty).
  • Имя задания - имя, присваиваемое заданию пользователем (для пакетных заданий) или формируемое автоматически (для STC/TSU-заданий). Идентификатор задания - уникальный код (номер) задания, устанавливаемый системой при вводе задания. Именно по идентификатору система отличает одно задание от другого.

    Класс задания устанавливает принадлежность задания к определенной группе в зависимости от формы запуска, атрибутов пользователя и требований к ресурсам. В z/OS поддерживается два специальных класса для STC и TSU заданий и до 36 классов для пакетных заданий. Классы пакетных заданий обозначаются символами A, B, ..., Z и цифрами 0, 1, ..., 9 и могут назначаться по усмотрению пользователей с помощью JCL. Если пользователь не указал класс, система сформирует его в соответствии с настройками по умолчанию.

    Приоритет задания (число в диапазоне 0-15) служит для определения очередности выполнения заданий. Обычно приоритет устанавливается системой автоматически на основе текущих атрибутов задания и может динамически изменяться в зависимости от времени ожидания в очереди. Наивысшему приоритету соответствует значение 15.

    С каждым заданием система ассоциирует два специальных набора данных: SYSIN и SYSOUT. Входной набор данных SYSIN отражает исходные данные, используемые приложениями задания. Эти данные могут быть представлены непосредственно в тексте задания (в этом случае говорят, что исходные данные размещаются во входном потоке ) или содержаться в указанных наборах данных и/или устройствах. Выходной набор данных SYSOUT служит для размещения системных сообщений, а также сообщений и результатов работы, выполняемых в рамках задания программ. Система предоставляет возможность просмотреть и распечатать SYSOUT, который иногда называют отчетом или листингом задания.

    Функции и компоненты подсистемы JES2

    Задания, поступающие в систему от различных источников, принимаются и обрабатываются специальным компонентом z/OS, который называется подсистемой управления заданиями JES (Job Entry Subsystem)Хотя слово entry часто переводят как <вводgt;, здесь его смысл следует трактовать шире.. JES принимает задания (рис. 5.19), поступающие с входных устройств, регистрирует их, осуществляет анализ и формирует очереди заданий, а затем передает задания на выполнение базовой управляющей программе BCP. После завершения выполнения задания и получения результатов от BCP, JES формирует отчет по заданию (листинг), передает его пользователю или выводит на указанные устройства. Чаще всего в установленных конфигурациях z/OS используется базовый компонент управления заданиями JES2, который и будет рассмотрен в данной главе. Альтернативой JES2 является опциональный компонент JES3, который в отличие от JES2 может использоваться для централизованного управления заданиями в многомашинной системе. Отметим, что JES2 работает в собственном адресном пространстве и имеет статус подсистемы (использует специальный SSI-интерфейс для взаимодействия с базовой управляющей программой z/OS). Кроме того, JES2 поддерживает собственные языковые средства, которые можно включать в текст задания (так называемые операторы JECL - Job Entry Control Language) и применять в виде консольных команд (системные команды JES2).

    (рис 5.19) Назначение подсистемы управления заданиями

    На рис. 5.20 представлена схема, иллюстрирующая основные этапы обработки заданий после того, как они направлены в подсистему JES2 .

    (рис 5.20) Этапы обработки заданий

    На этапе ввода (entry phase) осуществляется прием заданий, поступающих в систему от различных источников. Пользователь может задействовать для этих целей терминальные устройства, консоли, сетевые рабочие станции и т.п., применяя консольные команды START, MOUNT, команды TSO/E LOGON и SUBMIT. Существует возможность формировать и направлять задания на обработку из ранее запущенных программ и заданий. Поддерживается возможность удаленного RJE (Remote Job Entry) и сетевого NJE (Network Job Entry) ввода заданий, поступающих от узлов распределенной вычислительной сети. JES2 контролирует все пути поступления заданий с помощью специальных встроенных программ ввода INTRDR (Internal Reader). Текст каждого поступившего задания (предложения JCL и JECL) и вложенные в него входные данные пользователя (обозначаемые как набор данных SYSIN) помещаются в специальный набор данных JES2, называемый "спул" (spool).

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

  • JCL операторы задания и специальные операторы JES2 (JECL);
  • исходные данные, представленные во входном потоке (набор данных SYSIN);
  • выходные данные и сообщения, формируемые в процессе выполнения задания, и подготавливаемые для вывода в отчет (набор данных SYSOUT);
  • управляющая информация JES2;
  • сообщения для вывода в системный журнал SYSLOG.
  • На этапе ввода осуществляется регистрация задания, заключающаяся в присваивании заданию уникального идентификатора (JobID) и занесении учетной и статусной информации в специальный реестр JES2, получивший название очередь заданий (JOBQUEUE). Помимо идентификатора, JOBQUEUE содержит также значения класса, приоритета и текущего состояния задания. Фактически все множество очередей, представленных на рисунке, хранится в одной общей таблице JOBQUEUE. В этом случае выборка заданий производится по значению кода текущего состояния, показывающего, на каком этапе обработки задание находится в данный момент.

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

    На этапе преобразования (conversion phase) сначала производится анализ текста задания и трансляция его в специальный промежуточный код. Если обнаружены синтаксические ошибки, формируется отчет SYSOUT, включающий диагностические сообщения, и задание направляется на этап вывода, минуя стадию выполнения. В процессе анализа при необходимости происходит включение в текст задания и настройка параметров так называемых процедур JCL, вызываемых из внешних библиотек. Процедуры представляют собой готовые блоки предложений JCL, предназначенные для решения типовых пользовательских задач и хранящиеся в специальных наборах данных - библиотеках процедур (на рисунке обозначены как PROC). JES2 располагает настраиваемым списком используемых стандартных библиотек процедур (самая известная среди них - SYS1.PROCLIB). Пользователь также имеет возможность указать собственный набор библиотек процедур с помощью оператора JCLLIB.

    Если ошибки не обнаружены, промежуточный код задания помещается в спул, и задание передается в очередь на стадию выполнения. Следует отметить, что для каждого класса заданий формируется отдельная очередь. Внутри очереди задания упорядочены по приоритетам, назначаемым JES2 на основе установленной политики администрирования.

    На этапе выполнения (execution phase) ключевую роль играют системные программы, получившие название инициаторов (initiators). Обычно запускается несколько инициаторов одновременно, так чтобы один инициатор обслуживал одну или несколько конкретных очередей заданий (по значениям класса). Каждый инициатор работает в собственном виртуальном адресном пространстве в соответствии со следующим алгоритмом:

  • инициатор формирует запрос к JES2 на получение нового задания из очередей обслуживаемых им классов;
  • JES2 анализирует очередь заданий (JOBQUEUE) и передает инициатору сообщение о выбранном в соответствии с приоритетом задании;
  • инициатор считывает из спула промежуточный код задания и входные данные (SYSIN), определяет, какие ресурсы необходимы для выполнения, и открывает соответствующие наборы данных, а также копирует в свое адресное пространство загрузочные модули вызываемых в задании программ;
  • инициатор последовательно передает управление программам задания, контролируя ход их выполнения и поступающие сообщения; реальное управление выполнением программ реализуется базовой управляющей программой (BCP);
  • при завершении задания (нормальном или аварийном) результаты работы программ передаются инициатором в набор данных SYSOUT спула, а задания поступают в очередь на стадию вывода.
  • Отметим, что в z/OS поддерживается два типа инициаторов: инициаторы JES и инициаторы WLM. Инициаторы JES2 обычно запускаются автоматически при инициализации системы в соответствии с настройками JES2 и назначаются на обслуживание определенных классов заданий. Инициаторы WLM запускаются динамически в зависимости от текущей нагрузки системы и в соответствии с установленной политикой управления нагрузкой в целевом режиме.

    Важно подчеркнуть, что для большинства заданий не создаются новые адресные пространства z/OS, поскольку их выполнение происходит в адресных пространствах инициаторов. Исключение составляют задания классов STC и TSU, которые не обрабатываются инициаторами. Для этих классов JES2 самостоятельно создает отдельные адресные пространства для каждого пользовательского сеанса TSO и каждой запускаемой процедуры, а также обрабатывает поступающие сообщения.

    На этапе вывода (output phase) JES2 формирует отчет о выполнении задания в наборе данных SYSOUT в соответствии с требованиями и характеристиками назначенного выходного класса и указанными в задании атрибутами вывода. Выходной класс задания (всего доступно 36 классов, кодируемых символами A-Z или цифрами 0-9) определяется пользователем с помощью параметра SYSOUT оператора DD или оператора OUTPUT либо назначается подсистемой JES2 по умолчанию. Классы служат для группирования заданий с целью использования общих ограничений по выводу отчетов и для целей управления, но никак не связаны с используемыми для вывода устройствами. Подготовленные отчеты направляются в очередь на стадию печати или задерживаются на этапе вывода, если для задания установлен статус HOLD. Данный статус задается пользователем или устанавливается JES2 для некоторого класса или группы заданий. Дальнейшая обработка задержанных заданий производится по специальному указанию оператора (пользователя).

    На этапе печати (hardcopy phase) производится вывод подготовленного отчета из набора данных SYSOUT на указанное пользователем или установленное JES2 выходное устройство (принтер, узел сети и т.п.), и задание передается в очередь на стадию завершения.

    На этапе завершения (purge phase) JES2 осуществляет "очистку" спула и очереди заданий от информации, связанной с выполненным заданием, и формирует соответствующее сообщение.

    Следует напомнить, что в z/OS существует специальный опциональный компонент SDSF, предназначенный для просмотра параметров текущего состояния всех запущенных в системе заданий и отчетов о выполнении, а также предоставляющий возможность изменять некоторые параметры и управлять ходом выполнения заданий динамически.

    Структура пакетного задания JCL

    Итак, прежде чем передать пакетное задание системе, пользователь должен подготовить его текст на языке JCL. Обычно текст задания создается в некотором наборе данных с помощью текстового редактора, откуда специальными средствами пользовательского интерфейса его можно направить на обработку в подсистему JES2. z/OS требует, чтобы для представления заданий использовались только последовательные и библиотечные наборы данных с параметрами RECFM=FB и LRECL=80. Текст задания вводится, как правило, прописными буквами.

    Задание состоит из последовательности управляющих предложений JCL (job control statement)Иногда предложения JCL называют <картами> задания (job cards), вспоминая о тех временах, когда текст задания готовился на перфокартах. Оттуда, кстати, унаследовано ограничение строки задания в 80 символов.. Каждое предложение имеет следующую структуру:

    //ИМЯ ОПЕРАТОР ОПЕРАНДЫ КОММЕНТАРИЙ

    В первых двух позициях всегда (или почти всегда) указываются две косые черты (знак слэш / ), которые являются главным отличительным признаком предложений JCL.

    Поле имя начинается с третьей позиции и служит для идентификации представленного в предложении оператора. Фактически это метка, на которую можно ссылаться из различных предложений задания или других заданий. Имя может содержать не более восьми символов, включающих латинские буквы, цифры и специальные знаки ( $ # @ ). Имя должно начинаться с буквы или специального знака, русские буквы и пробелы использовать нельзя. В некоторых специальных случаях применяют составные имена, использующие в качестве разделителя точку. Пробел в третьей позиции является признаком отсутствия имени.

    Примеры правильных имен: STOUT1, SYSPRINT, IVANOV, IVAN#S

    Примеры неправильных имен: 3DIAGNOZ (начинается с цифры), DIAGNOSTIKA (содержит более восьми символов), ТОМ+И (содержит недопустимый символ И ).

    Вслед за полем имени следуют другие поля, отделяемые друг от друга одним или несколькими пробелами.

    Основные операторы JCL
    ОператорНазначение оператора
    JOB Начало задания и режим выполнения задания
    EXEC Начало шага задания, указание выполняемой программы или процедуры
    DD Описание набора данных и используемых устройств
    COMMAND Ввод системной (консольной) команды MVS или команды JES
    PROC Начало процедуры и описание параметров процедуры
    PEND Конец процедуры
    JCLLIB Список библиотек для поиска процедур, указанных в задании
    OUTPUT Параметры формирования отчета о выполнении задания (SYSOUT)
    INCLUDE Имя раздела библиотеки, текст которого необходимо включить в указанное место задания
    CNTL/ENDCNTL Начало и конец блока управляющих параметров, передаваемых программе во входном потоке
    IF/THEN/ELSE/ENDIF Условное выполнение шагов задания (ветвление)
    SET Инициализация или изменение значений символических параметров
    /* Оператор ограничения данных, представленных во входном потоке
    // Пустой оператор (конец задания)
    //* Оператор комментария

    Поле оператор определяет тип управляющего оператора JCL, который задается одним из ключевых слов, представленных в таблица 5.4. Назначение и использование основных операторов ( JOB, EXEC, DD ) будет рассмотрено в данной главе.

    Поле операнды предложения JCL содержит список разделенных запятыми параметров, которые записывают вслед за именем оператора (через один или несколько пробелов). С помощью параметров сообщают информацию, необходимую для выполнения оператора. Различают позиционные и ключевые параметры.

    Позиционные параметры часто имеют произвольный формат записи, но всегда указываются в строгой последовательности и всегда перед ключевыми параметрами. Если позиционный параметр опускается, то запятая, которая должна следовать за параметром, остается (исключение составляет случай, когда опускается последний параметр в списке позиционных параметров). Примеры записи позиционных параметров:

    333,TEST,,0.8E-15 NEW,,DELETE

    Ключевые параметры задаются с использованием предопределенных ключевых слов в виде: ключевое_слово=значение. Например, CLASS=B, REGION=100M, COND=(1,LE). Последовательность записи ключевых параметров - произвольная.

    Отдельные параметры могут включать подпараметры, которые также задают в виде списка, заключенного в апострофы или круглые скобки. Как и параметры, подпараметры могут быть позиционными и ключевыми. Скобки или апострофы опускаются, если в списке указывается один подпараметр. Например:

    DISP=(NEW,,DELETE) - позиционные подпараметры параметра DISP

    DCB=(RECFM=FB,LRECL=80) - ключевые подпараметры параметра DCB

    В поле комментарий предложения JCL помещают произвольную текстовую информацию, поясняющую назначение или особенности использования отдельных операторов. Отметим, что для этой цели может применяться специальный оператор комментария //*. Этот текст не обрабатывается при выполнении задания.

    Поля предложений JCL не должны выходить за пределы 71-й позиции строки. Если же текст предложения не умещается в одной строке, то его (кроме предложения комментария //* ) разрешается продолжить на следующей. При этом если необходимо перенести на следующую строку некоторые параметры из списка, то следует соблюдать такие правила:

  • Разрыв строки необходимо сделать точно в том месте, где располагается разделительная запятая списка параметров.
  • В следующей строке в позициях 1 и 2 нужно указать символы //. Продолжить ввод списка параметров, начиная не ранее 4-й, но не позднее 16-й позиции строки.

    Вот как выглядит запись многострочного предложения JCL:

    //OUT DD UNIT=SYSDA,VOL=SER=UB1,
    // DISP=NEW,SPACE=(1000(5,4)),
    // DSN=TEMP1
  • Исключением из этого правила является ситуация, когда перенос требует "разорвать" параметр, заключенный в апострофы. В этом случае следует вводить текст предложения до 71-й позиции включительно, а продолжение располагать точно с 16-й позиции следующей строки.

    Структуру задания в z/OS схематично можно представить в виде последовательности операторов (рис. 5.21). Первым всегда указывается оператор задания JOB, который отмечает начало задания. Непосредственно за оператором JOB могут следовать другие операторы ( DD, JCLLIB, OUTPUT ), с помощью которых описывают общие ресурсы задания в целом (наборы данных, библиотеки процедур, параметры вывода результатов).

    (рис 5.21) Структура задания

    Последующие операторы задания группируются по шагам или пунктам. Шаг (пункт) задания (job step) - это последовательность операторов JCL, начинающаяся с оператора EXEC и включающая некоторое количество иных операторов (в основном DD ). Оператор EXEC (его называют иногда оператором шага задания) устанавливает, какую программу (загрузочный модуль) или процедуру JCL необходимо выполнить. С помощью операторов DD в шаге задания описывают наборы данных и/или устройства, используемые при выполнении указанной в операторе EXEC программы (процедуры). Шаги задания выполняются строго последовательно. Однако есть возможность пропуска (невыполнения) некоторых шагов в зависимости от результатов работы предыдущих шагов с помощью операторов IF/THEN/ELSE или параметра COND операторов JOB и EXEC. Общее количество шагов задания не может превышать 255, включая шаги всех вызываемых в задании процедур.

    Далее приводится обзор основных операторов языка управления заданиями, который, однако, не претендует на полноту и не может служить заменой стандартной документации , . Многие операторы и особенности их применения представлены без некоторых деталей, которые могут понадобиться при практическом использовании JCL. При описании формата операторов используются привычные мнемонические правила:

  • информация, заключенная в квадратные скобки, является необязательной и может быть опущена;
  • символ | используется для указания альтернативных значений, из которых следует выбрать одно.
  • Нужно отметить, что язык JCL достаточно подробно описан в отечественной литературе , , , в том, правда, виде, в каком он сложился к началу 90-х годов.

    Оператор JOB

    Оператор задания JOB всегда располагается в начале задания и служит для определения основных пользовательских атрибутов задания, таких как класс, приоритет, время выполнения и др. Последовательность символов, указанная в поле имени предложения JOB, рассматривается как имя задания и должна присутствовать в обязательном порядке. Кроме того, в операторе JOB может быть определена учетная информация, параметры безопасности и производительности и некоторые другие.

    Формат оператора JOB:

    //имя JOB параметры
    Позиционные параметры:
        [(учетная информация)][,идентификатор программиста]
    Ключевые параметры:
        [,MSGLEVEL = (предложения,сообщения)]
        [,CLASS = класс задания]
        [,MSGCLASS = класс сообщений]
        [,REGION = nK | nM]
        [,ТIМЕ = (минуты, секунды)]
        [,COND=((код_завершения,условие)[,(код_завершения,условие)])

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

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

    Идентификатор программиста (до 20 символов) служит для идентификации пользователя, подготовившего задание. В качестве идентификатора можно указать фамилию и имя (инициалы) автора задания, номер отдела, в котором он работает, шифр темы, название организации и т.п. Если в идентификаторе используются русские буквы или пробелы, то его следует заключать в апострофы.

    Варианты записи учетной информации и идентификатора программиста могут выглядеть так:

    //PR1 JOB 5,'ИВАНОВ И.Л.'
    //PR2 JOB (5,А1),'ПЕТРОВ В.А.'
    //PR3 JOB 'T801,378',BOB
    //PR4 JOB ,'сидоров'
    //PR5 JOB 840,PETROV
    //PR6 JOB ,'KOBZON I.D.'

    Параметр MSGLEVEL (уровень полноты сообщений) определяет, какую информацию необходимо выдать в отчет о выполнении задания, и имеет следующий формат:

    MSGLEVEL=(a,b)

    Подпараметр a может принимать три значения: 0, 1 и 2. Если программист указал цифру 0, то в отчет выводится только оператор JOB. Значение 2 указывает, что требуется вывод всех операторов задания и операторов JECL, а цифра 1 определяет, что нужно выводить не только все операторы задания, но и операторы вызываемых процедур после замены в них символических параметров фактическими значениями.

    Подпараметр b может принимать два значения: 0 и 1. Значение 1 предписывает всегда выводить в отчет связанные с выполнением задания сообщения, инициируемые оператором, интерпретатором JCL, JES и подсистемой управления данными DFSMS. Значение 0 указывает, что в отчет будут включены только сообщения интерпретатора JCL. Если параметр MSGLEVEL опущен, то по умолчанию принимаются значения, установленные в настройках JES. Примеры:

    //GOD JOB ,,MSGLEVEL=(1,1)
    //ST     JOB    I,STUPIN,MSGLEVEL=2
    //ST     JOB    ,JOHN,MSGLEVEL=(,1)

    Во втором примере подпараметр b, а в третьем - подпараметр a будут установлены по умолчанию.

    Параметр CLASS (класс) относит задание к определенному классу выполнения заданий и задается символами A-Z, 0-9. Если класс не указан, то принимается значение, установленное в настройках JES в зависимости от источника задания.

    Пример:

    //U01A JOB 21,TOMA,CLASS=В

    Параметр MSGCLASS (класс сообщений) определяет выходной класс для системных сообщений, формируемых в процессе выполнения задания. Класс задается символами A-Z, 0-9. Параметр MSGCLASS дает возможность выводить все системные сообщения и выходные наборы данных, формируемые в шагах задания, в один и тот же класс или в разные классы. Такое разделение иногда может оказаться полезным.

    Пример. Предусмотреть вывод всех управляющих операторов задания и сообщений отдельно от выходных наборов данных:

    //U JOB (5.1),'ПЕТР',MSGLEVEL=(1,1),CLASS=B,MSGCLASS=С
    //STl EXEC PGM=PRINT
    //OUT DD SYSOUT=A

    Здесь для выполнения задания предусмотрен класс В, для вывода результатов шага задания (параметр SYSOUT оператора DD ) - класс А, а для вывода системных сообщений - класс С.

    Параметр REGION (область) задает максимальный размер области виртуальной памяти в пользовательском регионе, которую необходимо выделить для выполнения каждого шага задания. Параметр REGION задается в виде:

    REGION=nК | nМ

    где n - целочисленное значение, определяющее число килобайт (K) или мегабайт (M) виртуальной памяти. Например, если указать REGION = 900К, то шагам задания будет отводиться по 900 килобайт. Максимальное значение параметра в килобайтах - 2 096 128, в мегабайтах - 2047. Значение 0К или 0М означает, что задание требует в свое распоряжение всю приватную часть виртуального адресного пространства. Если параметр REGION в операторе JOB опущен, то используется значение, указанное в операторах EXEC. Если и в этих операторах он не задан, то принимается стандартное значение, заданное в настройках JES. Отметим, что с помощью параметра ADDRSPC, указываемого дополнительно, можно потребовать выделить для задания с помощью параметра REGION область реальной памяти ( ADDRSPC=REAL ).

    Параметр TIME (время) устанавливает максимальную продолжительность выполнения задания и имеет формат:

    ТIМЕ=(мин,сек)|мин|1440|NOLIMIT

    Время указывается в минутах и секундах либо только в минутах. Если секунды не указаны, можно не использовать скобки. Например, запись TIME = 30 означает, что заданию требуется выделить 30 минут процессорного времени. Число минут может быть не более 1440 (т.е. 24 часа), а секунд - не более 60. Если по истечении времени, указанного в TIME, задание не завершило работы, то система либо принудительно завершает задание, либо использует средства специальной обработки "просроченных" заданий. По умолчанию, когда параметр TIME не задан, ограничение на выполнение задания определяется настройками JES. Если в параметре TIME указать число 1440 или слово NOLIMIT, то время выполнения задания считается неограниченным.

    Варианты описания времени выполнения задания:

    //PRIMER1 JOB ,,TIME=10
    //PRIMER2 JOB ,,TIME =(10,30)
    //PRIMER3 JOB ,,TIME =(,30)

    Задание PRIMER1 выполняется не более 10 мин, задание PRIMER2 - не более 10 мин и 30 с, а задание PRIMER3 - 30 с.

    Параметр COND (от condition - условие) задает условия, при которых следует прекратить выполнение задания, если полученный на каком-либо шаге результат не устраивает пользователя. Для управления выполнением шагов задания используют коды завершения. Код завершения или код возврата (RC от Return Code) формируется выполняемой в шаге задания программой и может характеризовать "успешность" выполнения программы в зависимости от полученного результата. Например, для многих системных программ z/OS принято использовать следующие значения кодов завершения:

    0 - при обработке программы ошибок не обнаружено (успешное выполнение);

    4 - обнаружены несущественные ошибки, выдается предупреждающее сообщение, но выполнение программы было продолжено;

    8 - обнаружены ошибки, которые могут привести к невозможности выполнения задания (выдается сообщение об ошибках);

    12 - обнаружены серьезные ошибки, дальнейшая обработка программы невозможна (выдается сообщение о серьезной ошибке);

    16 - обнаружены ошибки, которые делают невозможным выполнение программы (выполнение программы прекращается).

    Используется следующий формат записи параметра COND:

    COND=((код_завершения,условие)[,(код_завершения,условие)_])

    Допустимое значение подпараметра код_завершения указывается в виде целого числа в диапазоне от 0 до 4095. Подпараметр условие задает условие проверки кода завершения мнемоническим отношением вида: GT - больше, чем, GE - больше или равно, EQ - равно, LT - меньше, чем, LE - меньше или равно, NE - не равно.

    Если заданное отношение к коду возврата, выработанному программой, которая вызывается оператором EXEC, не соблюдается, то выполнение задания прекращается. Внешние скобки можно опустить, если задано только одно условие. Условие, задаваемое параметром COND, проверяется перед выполнением каждого шага задания следующим образом: если код возврата, полученный на одном из предыдущих шагов, соответствует условию, то выполнение задания прекращается. Например, запись COND=(0,NE) предписывает прекратить выполнение задания, если окажется, что код завершения одного из шагов не равен нулю. В записи COND=(4,LT) указано, что если 4 меньше полученного кода завершения, то шаги задания не выполняются. Условие COND=((50,GE),(70,LE)) предписывает, что если 50 больше или равно коду возврата или 70 меньше или равно коду возврата, то оставшиеся шаги задания не выполняются. Таким образом, здесь задание будет выполняться до тех пор, пока код возврата находится в диапазоне от 51 до 69.

    Если параметр COND опущен, то проверка кода возврата не производится.

    Оператор EXEC

    Оператор выполнения EXEC (его также называют оператором шага задания) служит для указания программы или процедуры JCL, которую необходимо выполнить, а также для установления параметров выполнения шага. В задании должен присутствовать как минимум один оператор EXEC, но их может быть и несколько.

    Формат оператора EXEC:

    //[имя_шага_задания] EXEC позиционный параметр 
                              [,ключевые параметры]
    
        Позиционный параметр:
    
    PGM = имя_программы | *.имя_шага.имя_DD
    [PROC=]имя_процедуры
        Ключевые параметры:
    [,PARM = (значение, значение,...)]
    [,REGION = nК | nM]
    [,ТIМЕ = (мин,сек)]
    [,COND=((код_завершения,условие[,имя_шага]),...,[EVEN|ONLY])]
    ...

    Напомним: как и ранее, квадратные скобки означают, что параметр необязателен. Таким образом, единственным обязательным параметром оператора EXEC является позиционный параметр, задающий выполняемую программу (через ключевое слово PGM ) или процедуру (через ключевое слово PROC или без него), остальные параметры необязательны. Необязательно и имя шага задания, однако при его отсутствии могут возникнуть трудности анализа сообщений системы (неясно, к какому шагу задания они относятся), а также невозможно будет сделать ссылку на данный шаг задания.

    Параметр PGM определяет программу, которая должна быть выполнена в данном шаге задания. Например:

    //EXEPRIM1 EXEC PGM=MYPROG

    Вызываемая программа задается по имени раздела библиотечного набора данных, содержащего соответствующий загрузочный модуль. z/OS устанавливает определенный порядок поиска загрузочных модулей. По умолчанию поиск ведется в системных библиотеках загрузочных модулей, список которых определен в разделе LNKLST реестра SYS1.PARMLIB. Первой в этом списке обычно стоит библиотека SYS1.LINKLIB. В системных библиотеках находятся наиболее часто используемые программы общего назначения. Однако можно настроить задание на выборку загрузочных модулей из личных библиотек - библиотечных наборов данных, в которых хранятся программы пользователей. Личные библиотеки должны быть явно описаны в задании с помощью операторов DD с зарезервированными для этой цели именами JOBLIB или STEPLIB. Рассмотрим пример:

    //JOBA1 JOB (A21,DEP3,007),,CLASS=C
    //JOBLIB DD DSN=USERLIB1,DISP=SHR
    //STEP1 EXEC PGM=PRG1
    //STEP2 EXEC PGM=PGM2
    //STEPLIB DD DSN=USERLIB2,DISP=SHR

    В задании определены две личные библиотеки: библиотека задания USERLIB1, описанная с помощью оператора DD с именем JOBLIB, и библиотека шага задания USERLIB2, описанная с помощью оператора DD с именем STEPLIB. В этом случае поиск программы PRG1 будет производиться в следующем порядке: USERLIB1, библиотеки списка LNKLST, а поиск программы PRG2 - сначала USERLIB2 (так как именно в этом шаге описана данная библиотека), затем USERLIB1 и, наконец, библиотеки LNKLST.

    Если позиционный параметр описан как PGM=*.имя_шага.имя_DD, то программа вызывается из библиотеки загрузочных модулей, описанной в одном из предыдущих шагов задания. Здесь имя_DD - это имя оператора DD, в котором описывается библиотека загрузочных модулей, имя_шага указывает шаг задания, в котором находится упомянутый оператор DD. В приведенном ниже примере в шаге ST2 будет выполнена программа, загрузочный модуль которой хранится в разделе CALC библиотеки MYLIB, как указывает ссылка *.ST1.DSPROG:

    //ST1 EXEC PGM=MYPROG
    //DSPROG DD DSNAME=MYLIB(CALC),DISP=SHR
    //ST2 EXEC PGM=*.ST1.DSPROG

    Второй формат позиционного параметра оператора EXEC с использованием ключевого слова PROC или без него служит для выполнения процедуры в шаге задания. Процедура представляет собой последовательность операторов JCL, оформленных как автономная JCL-программа. Процедура может храниться в системной или пользовательской библиотеке процедур либо описывается непосредственно в задании. Список используемых системных библиотек процедур определяется системным программистом в настройках JES. Особенности использования и вызова процедур будут описаны ниже.

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

    Параметр PARM служит для передачи программе, выполняемой в шаге задания, определенной управляющей информации или исходных данных. Эта информация передается в виде текстовой строки длиной не более 100 символов, которая обычно включает ряд значений (подпараметров), разделенных запятыми. Если через PARM передается список значений, то весь список должен заключаться в апострофы или круглые скобки. Приведем примеры различных вариантов определения параметра PARM:

  • передача одного параметра:
    //STEP1 EXEC PGM=PR1,PARM=12
    //STEP2 EXEC PGM=PR1,PARM=LOAD
  • передача двух параметров:
    //STEP3 EXEC PGM=PR1,PARM=(LIST,NODECK)
    //STEP4 EXEC PGM=LOADER,PARM ='MAP,SIZE=150K'
    //PR1 EXEC PROC=РЕЗ,PARM='2000,YES'
  • Подпараметры, содержащие специальные знаки (например, русский текст, знак + и т. п.), следует заключать в апострофы или круглые скобки. Если апостроф встречается в подпараметре, то он повторяется дважды, например PARM = 'О''К!'. Информация, заключенная в апострофы, должна умещаться на одной строке, а заключенная в скобки может быть перенесена на другую строку.

    Параметры REGION и TIME аналогичны параметрам оператора JOB с той лишь разницей, что в EXEC они определяют размер области виртуальной памяти и время выполнения для шага задания. Параметр TIME оператора JOB имеет преимущество перед параметром TIME оператора EXEC: если время, указанное параметром TIME оператора EXEC, превосходит время, установленное параметром TIME оператора JOB, то значение параметра TIME оператора EXEC игнорируется. Параметр REGION в операторе EXEC также игнорируется, если задан параметр REGION в операторе JOB. Примеры:

    //SI EXEC PGM=A,REGION=40K
    //INT1 EXEC PGM=PR1,TIME=5
    //INT2 EXEC PGM=PR1,TIME=(,45)

    Параметр COND определяет условия для обхода шага задания. Он указывает, что возможность выполнения шага задания зависит от полученных значений кодов завершения на предшествующих шагах задания. Синтаксис параметра COND несколько отличается от аналогичного параметра оператора JOB:

    COND = ((код_завершения,условие[,имя_шага])... [,EVEN|,ONLY])

    Здесь наряду с подпараметрами код_завершения и условие, можно указывать имя одного из предыдущих шагов задания, по коду завершения которого будет вестись проверка ( имя_шага ). Если имя_шага не указано, условие будет проверяться для всех предыдущих шагов. Подпараметры EVEN и ONLY следует использовать, когда выполнение текущего шага требуется поставить в зависимость от наличия в задании аварийно завершенных шагов (для таких шагов код завершения не сформирован). Подпараметр EVEN требует выполнять текущий шаг, даже если один из предыдущих шагов завершился аварийно, ONLY - только если один из предыдущих шагов завершился аварийно.

    Параметр COND может содержать до восьми условий, включая EVEN и ONLY. Шаг задания не будет выполнен, если соблюдается хотя бы одно из заданных условий. Рассмотрим ряд примеров:

  • шаг ST3 не выполняется, если 8 > RC шага ST1:
    //ST3 EXEC PGM=PROG3,COND=(8,GT,ST1)
  • шаг ST6 не выполняется, если 8 $$\le$$ RC шага ST1 или 8 $$\le$$ RC шага ST2:
    //ST6 EXEC PGM=AP,COND=((8,LE,ST1),(8,LE,ST2))
  • шаг ST9 не выполняется, если 16 $$\ge$$ RC всех предыдущих шагов, или 90 $$\le$$ RC шага ST2, или ни один из предыдущих шагов не завершился аварийно:
    //ST9 EXEC PGM=AP,COND=((16,GE),(90,LE,ST2),ONLY)
  • шаг ST7 не выполняется, если 10 $$\le$$ RC шага ST5, в противном случае шаг будет выполнен, даже если один из предыдущих шагов завершился аварийно:
    //ST7 EXEC PGM=AP,COND=((9,LT,ST5),EVEN)
  • Оператор DD

    Оператор описания данных DD (data definition) - это оператор определения данных и устройств, используемых в задании и его отдельных шагах. Операторы DD, относящиеся к определенному шагу задания, следуют за оператором EXEC этого шага задания. В одном шаге задания может быть описано не более 3273 операторов DD. Оператор DD может располагаться также за оператором JOB, если требуется описать наборы данных, общие для всего задания (например, библиотеки загрузочных модулей и др.).

    Оператор DD может содержать один позиционный и около 60 ключевых параметров. Познакомимся с некоторыми наиболее важными из них, исключив из рассмотрения параметры, используемые для описания SMS и VSAM наборов данных.

    Формат оператора DD:

    //имя DD [позиционный параметр][,ключевые параметры]
        Позиционный параметр:
    * | DATA | DUMMY
        Ключевые параметры:
    [,DSN[AME] = имя_набора_данных]
    [,DCB = (список подпараметров)]
    [,UNIT = устройство]
    [,VOL[UME] =(список подпараметров)]    
    [,SPACE = (список подпараметров)]
    [,DISP = (список подпараметров)]
    [,SYSOUT = (список подпараметров)]
    [,LABEL = (список подпараметров)]
    ...

    Важнейшим атрибутом оператора DD является имя, связывающее описываемый набор данных с кодом вызываемой программы. Как отмечалось в п.5.1.3, в программе для каждого используемого набора данных с помощью макровызова DCB устанавливается так называемое dd-имя (ddname). Если в шаге задания указать оператор DD с таким же именем, то появляется возможность определить или изменить ряд параметров указанного набора данных через оператор DD задания, то есть в момент запуска программы. Таким образом, при выполнении любой программы пользователь должен в первую очередь выяснить, какие dd-имена следует применять для описания данных и устройств, необходимых для ее работы. Это можно сделать с помощью соответствующей документации и руководств. Например, для программы-компилятора языка ассемблера установлены следующие dd-имена:

    SYSIN - для описания исходного модуля;

    SYSPRINT - для вывода сообщений компилятора;

    SYSLIN - для описания объектного модуля;

    SYSUT1 - промежуточный набор данных.

    Некоторые имена операторов DD зарезервированы системой для специальных целей. К ним относятся, например, следующие имена:

    JOBLIB - для описания личной библиотеки загрузочных модулей, доступной заданию;

    STEPLIB - для описания личной библиотеки загрузочных модулей, доступной для шага задания;

    SYSABEND - для выходного набора данных, в который может быть записан дамп системного ядра и области памяти обрабатывающей программы, если шаг задания завершился аварийно;

    SYSUDUMP - для выходного набора данных, в который может быть записан дамп области памяти обрабатывающей программы, если шаг задания завершился аварийно;

    SYSCHK - для выходного набора данных контрольной точки;

    SYSIN - для входного набора данных ввода заданий;

    SYSPRINT - для набора данных, выводимого на печатающее устройство;

    При использовании процедур могут применяться составные имена операторов DD, о чем речь пойдет немного ниже.

    Только в одном случае у оператора DD может отсутствовать имя: при описании сцепленных наборов данных, рассматриваемых системой как единый набор данных:

    //SCHETA  DD ...
    //        DD ...
    //        DD ...

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

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

    *.имя_DD

    или

    *.имя_шага_задания.имя_DD

    Первый формат используется при ссылке внутри шага задания, а второй формат применяется при ссылке на один из предшествующих шагов задания. Например:

    //PR  JOB SECT
    //ST1 EXEC PGM=SUN1
    //UT1 DD DSNAME=LIB1,DCB=(RECFM=FB,LRECL=80,BLKSIZE=400)
    //UT2 DD DSNAME=LIB2,DCB=*.UT1
    //ST2 EXEC PGM=SUN2
    //GO  DD DSNAME=LIB3,DCB=*.ST1.UT1

    Теперь рассмотрим позиционный параметр оператора DD, который может принимать одно из трех взаимоисключающих значений:

    * | DATA | DUMMY

    Первое значение (*) служит для описания данных, размещаемых во входном потоке, то есть непосредственно в тексте задания вслед за оператором DD. Данные могут занимать одну или несколько строк задания и завершаться ограничительным оператором /*. В некоторых случаях ограничительный оператор может быть опущен. Признаком конца набора данных является в этом случае первый встретившийся управляющий оператор JCL с символами // в первых двух позициях строки.

    Пример:

    //SYSIN DD *
    1 ИВАНОВ 12345 7.9
    2 ПЕТРОВ 67890 3.8
    3 СИДОРОВ 73452 9.0
    /*

    Если же входные данные включают управляющие операторы JCL, то есть строки, содержащие в первых двух позициях //, то необходимо вместо * использовать параметр DATA. В приведенном ниже примере в качестве входных данных определены две строки, содержащие предложения JOB и EXEC:

    //MYJCL DD DATA
    //USER1A JOB ,BOB,MSGLEVEL=1
    //ST1 EXEC IEFBR14
    /*

    Если во вводимых во входном потоке данных должны содержаться строки, начинающиеся с символов /*, то в этом случае можно определить другой ограничитель с помощью параметра DLM. В частности, при компиляции C/C++ приложений можно использовать этот прием следующим образом:

    //PR     JOB SECT
    //ST1 EXEC PGM=CCNDRVR
    //COMPILE DD *,DLM=<>
    # include <stdio.h>
    /*комментарий*/
    main();
    ...
    <>

    Здесь двухсимвольное значение <> в первых двух позициях строки служит для ограничения входного набора данных подобно /*.

    Следует обратить внимание, что по умолчанию JES принимает для вводимого таким образом набора данных значения LRECL=BLKSIZE=80.

    Значение позиционного параметра DUMMY применяется, чтобы объявить некоторый набор данных как фиктивный. В этом случае система не производит никаких действий над набором данных. Например, предложение

    //SYSPRINT DD DUMMY

    обеспечивает подавление вывода сообщений, направляемых программой в набор данных с dd-именем SYSPRINT.

    Рассмотрим ключевые параметры оператора DD.

    Параметр DSNAME (допускается сокращенная запись DSN ) определяет имя набора данных (простое или составное), например:

    //BIBL DD DSNAME=LIB1    
    //SYSIN DD DSN=D.USER1.DATA

    Для указания раздела библиотеки в скобках записывают имя раздела:

    //LOAD DD DSN=USERLIB(PROG1)
    //XXX DD DSN=MY.JCL(JOBTEST)

    Перед именем временного набора данных записывают два знака амперсанда :

    //SYSLIN    DD DSN=LOADSET(GO)
    //SYSUT1    DD DSN=SYSUT1

    Временные наборы данных автоматически уничтожаются системой после завершения шага задания. Отсутствие в операторе DD параметра DSNAME также означает, что набор данных временный. В этом случае имя набора данных будет сгенерировано автоматически, например, так:

    SYSxxxxx.Txxxxxx.RA000.jobname.Rxxxxxx

    где x - определенным образом сформированные цифры и символы.

    В качестве значения параметра DSNAME можно указывать ссылки на другие операторы DD в формате *.имя_DD или *.имя_шага.имя_DD.

    //STFG EXEC PGM=PROG1
    //SYSUT1 DD DSN=DATA.IN
    ...
    //SYSLIN DD DSN=*.STFG.SYSUT1

    Параметр DISP (диспозиция) определяет исходное состояние набора данных, а также действия, которые необходимо произвести с набором данных после завершения шага задания или всего задания: сохранить, уничтожить, каталогизировать и др. Формат записи параметра DISP включает три позиционных подпараметра:

    DISP=([статус][,дисп_НЗ][,дисп_АЗ])

    где статус - исходное (текущее) состояние набора данных, дисп_НЗ - действие при нормальном завершении шага задания, дисп_АЗ - действие, которое надлежит выполнить при аварийном завершении шага задания.

    Подпараметр статус может принимать следующие значения:

    NEW - в указанном шаге задания создается новый набор данных;

    OLD - набор данных существует (создан ранее);

    SHR - набор данных существует и может быть использован одновременно другим заданием, т.е. разделяется различными заданиями в режиме чтения;

    MOD - набор данных существует и будет модифицироваться в указанном шаге задания (используется только для последовательных наборов данных).

    Подпараметры диспозиции дисп_НЗ и дисп_АЗ могут принимать следующие значения:

    DELETE - набор данных следует уничтожить;

    KEEP - набор данных следует сохранить;

    CATLG - набор данных следует сохранить и каталогизировать;

    UNCATLG - набор данных нужно сохранить, но при этом исключить из системного каталога.

    PASS - набор данных следует передать для использования в последующем шаге того же задания.

    Последнее значение ( PASS ) может быть использовано только для подпараметра дисп_НЗ.

    Примеры задания диспозиции:

  • DISP=(NEW,KEEP,DELETE) - набор данных создается и будет сохранен при нормальном завершении и удален при аварийном завершении шага задания;
  • DISP=(SHR,KEEP,UNCATLG) - набор данных существует и будет сохранен при нормальном завершении и исключен из каталога при аварийном завершении шага задания.
  • Допускается не указывать некоторые или даже все подпараметры, учитывая следующие правила формирования их значений по умолчанию:

  • если не указан первый подпараметр ( статус ), то принимается значение NEW ;
  • если не указан второй подпараметр ( дисп_НЗ ), то принимается значение DELETE для нового и KEEP для существующего набора данных;
  • если не указан третий подпараметр ( дисп_АЗ ), то принимается значение, заданное для второго подпараметра ( дисп_НЗ );
  • если не указан параметр DISP, то принимаются значения (NEW,DELETE,DELETE), то есть набор данных создается и уничтожается во время выполнения шага задания (временный).
  • Примеры:

    DISP=(NEW,KEEP) и DISP=(,KEEP) соответствует DISP=(NEW,KEEP,KEEP)
    DISP=NEW и DISP=(NEW,,DELETE) соответствует 
                                  DISP=(NEW,DELETE,DELETE)
    DISP=OLD соответствует DISP=(OLD,KEEP,KEEP)
    DISP=(OLD,,DELETE) соответствует DISP=(OLD,KEEP,DELETE)
    DISP=(SHR,,KEEP) соответствует DISP=(SHR,KEEP,KEEP)

    Параметр UNIT назначает набору данных устройство ввода-вывода и определяется в большинстве случаев одним из трех значений (см. п. 5.1.3):

    UNIT=адрес | типовое_имя | групповое_имя

    Подпараметр адрес задает трех- или четырехразрядный физический адрес устройства (в шестнадцатеричном представлении). Подпараметр типовое_имя задает устройство по установленному производителем оборудования номеру модели, однозначно указывающему на тип устройства. Подпараметр групповое_имя определяет устройство через логическое имя устройства или группы устройств, задаваемое системным программистом на этапе конфигурирования оборудования с помощью компонента HCD в таблице EDT. Ниже приведены примеры задания параметра UNIT различными способами:

    //AD DD UNIT=220 - адрес устройства
    //TD DD UNIT=3390 - типовое имя
    //GD DD UNIT=SYSDA - групповое имя
    //GD DD UNIT=VIO - набор данных в виртуальной памяти

    Параметр VOLUME (сокращенно VOL ) указывает том или тома, на которых размещается набор данных. Рассмотрим наиболее употребительные варианты использования данного параметра.

    В первом варианте том определяется посредством задания серийного имени тома в виде:

    VOL=SER=имя[,имя]...

    Например:

    //DSETl DD DSN=YS,UNIT=SYSDA,VOL=SER=PTOM01

    Здесь описан набор данных YS, находящийся на устройстве, принадлежащем к группе SYSDA с серийным номером тома PTOM01. Для многотомных наборов данных следует указывать список имен.

    Во втором варианте том задается через ссылку, определяемую одним из трех способов:

    VOL=REF=имя_набора_данных | *.имя_DD |.имя шага.имя_DD

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

    //STEP1 EXEC PGM=....
    //DD1 DD DSN=OLD.DATASET,DISP=SHR
    //DD2 DD DSN=DSET1,DISP=(,CATLG,DELETE),VOL=REF=*.DD1
    //STEP2 EXEC PGM=...
    //DD3 DD DSN=DSET2,DISP=(,CATLG),VOL=REF=*.STEP1.DD1

    Здесь создаваемые наборы данных DSET1 и DSET2 будут размещены на том же томе, что и существующий набор данных с именем OLD.DATASET.

    Параметр DCB устанавливает характеристики логической организации набора данных, фиксируемые в блоке управления данными (Data Control Block), который создается системой для каждого набора данных. Блок управления данными представляет собой таблицу, которая после открытия заполняется информацией из описания набора данных в программе и дополняется данными из соответствующего оператора DD. Параметр DCB обычно имеет формат:

    DCB=(список подпараметров)

    Все подпараметры DCB являются ключевыми. Перечислим основные из них:

  • DSORG - тип организации набора данных;
  • RECFM - формат записей;
  • LRECL - длина логической записи;
  • BLKSIZE - длина блока;
  • BUFNO - число буферов ввода-вывода, выделяемых набору данных;
  • BUFL - размер каждого буфера в байтах.
  • Подпараметр RECFM может принимать следующие значения: F - записи фиксированной длины; V - записи переменной длины; U - записи неопределенной длины. Выбор типа записи определяет пользователь. Если он группирует записи в блоки, то указывает это, добавляя к символу формата букву В. Например, указание RECFM=FB означает, что сблокированные записи имеют фиксированную длину.

    Примеры:

  • Набор данных состоит из записей фиксированной длины по 128 байт, которые объединяются в блоки по четыре записи в каждом:
    DCB=(RECFM=FB,LRECL=128,BLKSIZE=512)
  • Набор данных содержит неблокированные записи фиксированной длины по 80 байт:
    DCB=(BLKSIZE=80,RECFM=F)
  • Вместо ключевых подпараметров DCB можно записать ссылку на другой оператор DD, причем некоторые подпараметры можно переопределить заново:

    //ST1 DD DSN=VAX,DCB=(RECFM=VB,LRECL=64,BLKSIZE=640)
    //PRINT DD DCB=(*.ST1,BLKSIZE=128)

    Здесь подпараметры набора данных для параметра DCB копируются из оператора DD с именем ST1, кроме размера блока, который задается непосредственно.

    Параметр SPACE задает требуемый объем памяти для размещения создаваемого набора данных на жестком диске, то есть набора данных с диспозицией NEW. Обычно этот параметр записывают в виде:

    SPACE=(размер[,(количество[,приращение][,оглавление])][,RLSE])

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

    TRK - блок соответствует физической дорожке диска;

    CYL - блок соответствует цилиндру диска;

    число - определяет значение размера блока в байтах.

    Так, параметр SPACE=(CYL,10) определяет область дисковой памяти размером 10 цилиндров, а параметр SPACE=(800,30) объявляет, что требуется память объемом в 30 блоков по 800 байт каждый. Если указанный объем не может быть выделен (диск переполнен), система завершает шаг задания аварийно.

    В том случае когда первоначального объема памяти недостаточно для размещения данных, система может выделить дополнительные блоки памяти, количество которых определяется подпараметром приращение. Установлено, что система может выделять дополнительные блоки не более 15 раз. Так, параметр SPACE=(CYL,(40,5)) запрашивает первоначально 40 цилиндров, а если этого объема памяти будет недостаточно, то система будет выделять по пять цилиндров до 15 раз, т. е. при необходимости всего будет выделено 40+5*15=115 цилиндров. Если приращение не указано, то дополнительные блоки не выделяются.

    Параметр оглавление задается только для наборов данных с библиотечной организацией. Он определяет необходимое количество блоков, отводимых под оглавление библиотечного набора данных. Один блок оглавления содержит 256 байт. Так, например, параметр SPACE=(TRK,(100,10,5)) запрашивает память в 100 дорожек и по 10 дополнительных дорожек (до 15 раз), а также пять блоков по 256 байт оглавления библиотечного набора данных. Отсутствие подпараметра оглавление обычно косвенно указывает на набор данных с последовательной организацией.

    Очевидно, что не всегда удается точно предсказать требуемый для набора данных объем внешней памяти. Подпараметр RLSE служит для освобождения памяти, выделенной, но не использованной под размещение данных. Освобождение свободной памяти производится при закрытии набора данных. Так, параметр SPACE=(TRK,(40,,8),RLSE) указывает, что запрашивается 40 дорожек без приращения. Для оглавления выделяется восемь блоков. Незанятая память после закрытия набора данных освобождается.

    Параметр LABEL чаще всего используется для описания набора данных на магнитной ленте. В нем могут быть указаны порядковый номер набора данных на МЛ, тип метки, срок хранения набора данных, пароль. Наиболее употребительный формат параметра:

    LABEL=([номер][,формат][PASSWORD][,IN|,OUT])

    Подпараметр номер задает последовательный номер набора данных на ленточном томе. Значения 0 или 1 указывают на первый по порядку набор данных. Для каталогизированных наборов данных, а также наборов данных, передаваемых из предыдущего шага задания (DISP=,PASS), номер можно не указывать.

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

    SL - стандартный формат IBM (используется по умолчанию, можно не указывать);

    SUL - указывает, где набор данных имеет стандартные метки и метки пользователя;

    AL - используется формат ISO/ANSI;

    NSL - набор данных имеет нестандартные метки;

    NL - набор данных не имеет меток;

    BLP - необходимо обойти обработку метки набора данных.

    Подпараметр, задаваемый ключевым словом PASSWORD, требует при изменении набора данных, чтобы пользователь ввел правильный пароль, используя консоль или терминал TSO.

    Ключевые слова IN и OUT указывают, что набор данных обрабатывается для ввода или вывода соответственно.

    В приводимом ниже примере открывается для чтения 5-й набор данных, имеющий нестандартные метки, на ленточном томе TAPE01:

    //DD1 DD DSNAME=NAB1,UNIT=TAPE01,
    // VOL=SER=MT1,LABEL=(5,NSL,,IN)

    Параметр SYSOUT идентифицирует набор данных как системный выходной набор данных. Наиболее употребительная форма для записи параметра:

    SYSOUT=(выходной_класс[,имя_прог])

    Чаще всего подпараметр выходной_класс определяет имя выходного класса для описываемого набора данных в виде символа А-Z или 0-9. Атрибуты выходных классов определяются при настройке JES. Если в качестве значения выходного класса указана звездочка (*), это означает, что следует использовать то же значение, что у параметра MSGCLASS, определенное в операторе ,) в позиции данного подпараметра задает так называемый "пустой" класс, означающий, что основные атрибуты вывода будут определены в операторе задания OUTPUT, ссылка на который должна быть указана далее с помощью параметра OUTPUT.

    Подпараметр имя_прог позволяет указать имя программы (загрузочного модуля), обрабатывающей выходной набор данных. Если подпараметр не указан, JES будет обрабатывать выходной набор данных стандартным способом, определенным для соответствующего класса.

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

    Примеры использования параметра SYSOUT:

  • определение выходного класса B:
    //SYSPRINT DD SYSOUT=B
  • определение выходного класса по значению MSGCLASS:
    //YSl JOB  ,,MSGCLASS=A
    //ST1 EXEC PGM=ZARPLATA
    //DD1 DD   SYSOUT=*
  • определение пустого выходного класса и ссылки на оператор OUTPUT:
    //OUT1 OUTPUT BURST=Y,CHARS=(GT12),COPIES=3
    ...
    //DS DD SYSOUT=(,),OUTPUT=*.OUT1
  • обработка выходного набора данных программой ввода заданий INTRDR:
    //SYSUT2 DD SYSOUT=(X,INTRDR)
  • Итак, мы рассмотрели небольшую часть из общего числа параметров оператора DD, однако наиболее важную с точки зрения практического использования. Рассмотрим ряд примеров описания наборов данных при решении некоторых типовых задач .

  • Описание каталогизированных наборов данных на DASD. В этом случае достаточно указать только параметры DSN и DISP, поскольку остальную необходимую информацию о размещении набора данных система получит из каталога, например:
    //CATDS1     DD    DSN=AS30.MY.DSET,DISP=OLD
    //CATDS2     DD    DSN=LIB.DATA(CHAR),DISP=SHR
  • Описание некаталогизированных наборов данных на DASD. Здесь требуется указывать дополнительно значения параметров UNIT и VOLUME, например:
    //NOCATDS    DD    DSNAME=AS30.MY.DSET,DISP=OLD,
    //        VOL=SER=D01457,UNIT=3390
  • Описание нового non-SMS набора данных на жестких магнитных дисках. Требуется задавать параметры DCB и SPACE. В приводимом ниже примере создается библиотечный набор данных со 120-байтными записями фиксированной длины на выделенном пространстве внешней памяти размером 10 цилиндров с приращением в три цилиндра. На оглавление отводится два блока по 256 байт, при завершении шага задания неиспользуемая память будет освобождена, а набор данных сохранен.
    //NEWDS   DD    DSNAME=D.AS32.DATA,DISP=(NEW,KEEP),
    //        VOL=SER=BIBLIO,UNIT=3380,
    //        DCB=(RECFM=F,LRECL=120),
    //        SPACE=(CYL,(10,3,2),RLSE)
  • Процедуры JCL

    В языке управления заданиями, как и в других языках программирования, могут быть определены процедуры. Мы уже не раз упоминали этот важнейший элемент JCL при рассмотрении различных функций z/OS.

    Процедура представляет собой последовательность предложений (операторов) JCL, оформленных как автономная JCL-программа. Процедура может храниться в системной или пользовательской библиотеке процедур либо непосредственно описываться в задании. Процедуры JCL, как и процедуры языков программирования, предназначены для решения типовых пользовательских задач на основе принципа: "один раз записал и сохранил, много раз использую". Такой подход существенно упрощает процесс составления заданий.

    При обращении к процедуре входящие в ее состав операторы JCL вставляются в задание вместо вызывающего оператора EXEC. При этом могут быть изменены значения параметров операторов процедуры, целые операторы, а также добавлены новые операторы.

    В JCL поддерживается два вида процедур: каталогизированные процедуры и процедуры во входном потоке. Каталогизированные процедуры размещаются в специальных наборах данных - библиотеках процедур. JES2 располагает настраиваемым списком используемых стандартных библиотек. Пользователь также имеет возможность указать собственный набор библиотек процедур с помощью оператора JCLLIB (о нем речь пойдет ниже). Процедуры во входном потоке описываются непосредственно в задании после оператора JOB.

    Процедура начинается оператором процедуры PROC и заканчивается оператором конца процедуры PEND. Имя оператора процедуры является именем процедуры при размещении ее во входном потоке. В операторе PROC могут быть описаны параметры процедуры. Процедуры могут содержать различные операторы JCL, включая EXEC, DD, OUTPUT, IF/THEN/ELSE, INCLUDE, CNTL, ENDCNTL, SET, а также вызовы других процедур. Процедуры не должны содержать операторы DD * и DD DATA, оператор //JOBLIB DD, операторы JES и описания других процедур (операторы PROC и PEND ).

    Каждый оператор EXEC вместе с принадлежащими ему операторами DD называется шагом (пунктом) процедуры. Имя оператора EXEC является именем шага процедуры. В общем виде процедура имеет следующую структуру:

    //имя PROC параметры
    // EXEC
    // DD
    ...
    // EXEC
    // DD
    ...
    // PEND

    В теле процедуры могут быть записаны так называемые символические или формальные параметры, которые при вызове процедуры могут быть заменены на заданные пользователем значения ( фактические параметры ). Формальные параметры представляются в виде имя, и могут быть указаны в процедуре в качестве параметра, подпараметра или значения в любом операторе. Фактические значения для символических параметров устанавливаются в вызывающем процедуру операторе EXEC, в виде списка, каждый элемент которого выглядит так:

    имя=фактическое_значение

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

    //MYPROC  PROC  UNT=SYSDA,PRN=A,TOM=DISK8,P=P2,NAME=DS.OPT
    //ST1     EXEC  PGM=SUV,REGION=50K
    //LIB     DD    DSN=SYSLIB,DISP=OLD
    //SYSIN   DD    DSN=NAME,DISP=(NEW,KEEP),
    //              VOL=SER=TOM,UNIT=UNT,
    //              SPACE=(TRK,(10,1,10))
    //SYSOUT  DD    SYSOUT=PRN
    //ST2     EXEC  PGM=CALC,PARM=(P1,P,P3)
    //TABL    DD    DSN=TABL.DATA,DISP=SHR
    //              VOL=SER=WORK1,UNIT=DISK
    //        PEND

    Данная процедура с именем MYPROC содержит два шага ( ST1 и ST2 ). В теле процедуры выделено пять формальных параметров. В операторе PROC представлен список фактических стандартных значений формальных параметров, которые будут использоваться по умолчанию в случае, если пользователь не определит собственные фактические значения. Например, если процедура будет вызвана в задании следующим образом:

    //PRIM1 EXEC    MYPROC

    то это как раз такой случай: все значения формальных параметров будут выбраны из оператора PROC.

    Если же пользователь захочет изменить все или некоторые стандартные значения, их необходимо указать непосредственно в операторе EXEC:

    //PRIM2 EXEC MYPROC,NAME=BIBL,UNT=3390

    В данном случае устанавливаются новые значения для формальных параметров NAME и UNT, а остальные параметры примут стандартные значения, записанные в операторе PROC. При изменении значений параметров пользователь обязан следить, чтобы модифицированная таким образом процедура была корректной как синтаксически, так и семантически. Очевидно, что значения символических параметров, назначенных пользователем в операторе EXEC, действуют только в текущем шаге задания. На другие шаги задания их действие не распространяется, и там могут быть установлены другие значения.

    Наряду с использованием символических параметров, существует возможность модифицировать целиком или частично операторы процедуры EXEC и DD. Например, модификация параметров операторов EXEC может производиться следующим образом:

    //PRIM3 EXEC MYPROC,REGION.ST1=100K,COND.ST2=(8,LE,ST1)

    Здесь пользователь требует изменить значение параметра REGION, используемого в шаге процедуры ST1, и добавить параметр COND к оператору шага ST2. Синтаксис записи модифицируемых параметров вполне очевиден.

    Модификация параметров операторов DD осуществляется несколько иначе. Например, при необходимости изменить имя и диспозицию набора данных, описанного в операторе DD с именем LIB шага ST1, и отказаться от определения параметров в VOL и UNIT операторе DD с именем TABL шага ST2, при вызове процедуры следует записать:

    //PRIM4 EXEC MYPROC,NAME=XXXXX.YY,P=P5
    //ST1.LIB     DD DSN=USERLIB,DISP=SHR
    //ST2.TABL DD DSN=TABL1.DATA,VOL=,UNIT=

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

    Точно таким же образом может производиться добавление в процедуру новых операторов DD:

    //PRIM5 EXEC MYPROC,PRN=*
    //ST2.SYSPRINT DD SYSOUT=A

    Здесь к шагу ST2 процедуры будет добавлен оператор DD с именем SYSPRINT. Таким способом можно обойти ограничение на использование в теле процедур операторов DD * и DD DATA.

    Значительную роль в работе пользователей z/OS играют имеющиеся в системе каталогизированные процедуры. Как уже отмечалось, обычно существует несколько стандартных библиотек процедур (самая известная среди них - SYS1.PROCLIB ), определяемых системным программистом в настройках подсистемы JES2. Библиотеки содержат множество готовых процедур, предназначенных для решения типовых задач пользователей и администраторов, включая процедуры поддержки разработки приложений (компиляция, редактирование связей и выполнение программ), процедуры запуска и настройки системных компонентов, процедуры управления данными и т.п.

    Для вызова таких процедур в задании необходимо указать имя каталогизированной процедуры и при необходимости фактические параметры, а также модифицирующие операторы. Важно подчеркнуть, что в качестве имени каталогизированной процедуры используется имя раздела библиотеки процедур, а не имя оператора PROC! Отметим также, что каталогизированные процедуры могут вызываться по команде оператора START, при этом порождаются запускаемые процедуры (STC-задания), о которых упоминалось ранее. Примеры применения некоторых каталогизированных процедур при разработке приложений будут рассмотрены в п. 5.1.8.

    Помимо системных библиотек процедур, доступных пользователям по умолчанию, существует возможность создания и использования личных библиотек процедур. В этом случае потребуется сообщить системе имена таких библиотек с помощью оператора JCLLIB. Данный оператор имеет единственный параметр ORDER, с помощью которого можно задать список личных библиотек, используемых в задании:

    ORDER=(библиотека1[,библиотека2]...)

    В приведенном ниже примере определен список из двух библиотек ( USER1.PROCLIB,USER1.WORKLIB ), которые система будет использовать для поиска процедуры SMETA в первую очередь. Если поиск завершится неудачей, будут просматриваться системные библиотеки:

    //USER1 J0B ...
    //USERLIB JCLLIB ORDER=(USER1.PROCLIB,USER1.WORKLIB)
    // EXEC PROC=SMETA

    Структура отчета о выполнении задания

    Как отмечалось ранее, все сообщения и результаты работы программ, выполняемых в рамках задания, группируются JES2 в наборе данных SYSOUT. На основе этих данных формируется отчет о выполненном задании. У пользователя есть несколько способов получить и вывести отчет, используя средства TSO/E, ISPF/PDF или SDSF. На рис. 5.22 представлен общий вид отчета (листинга) о выполнении задания.

    (рис 5.22) Пример отчета о выполненном задании

    Стандартный листинг состоит из нескольких информационных блоков:

  • Общая информация, определяемая при инсталляции системы.
  • Статистическая информация, формируемая подсистемой управления заданиями JES.
  • Текст задания на языке JCL, если заданы соответствующие значения параметра MSGLEVEL и сообщения о синтаксических ошибках.
  • Системные сообщения о ходе и результатах выполнения задания.
  • Основным признаком правильности выполнения задания является значение кода завершения (Condition code), отображаемое в блоке 4 листинга в виде:

    СOND CODE = XXXX

    Если код завершения равен 0000, то задание выполнено успешно. Ненулевое значение кода означает, что задание завершилось аварийно (состояние ABEND ). Каждому значению кода завершения соответствует определенная причина, а в отчете содержатся поясняющие диагностические сообщения.

    Страницы:

    Понятие задания

    В п. 5.1.1 мы определили задание (job) как внешнюю единицу работы z/OS. Это означает, что пользователь может запросить у системы выполнение какой-либо работы (конечно, связанной с запуском определенных приложений) с помощью специальным образом записанного и переданного системе текста. Это и есть задание. Задания составляются на языке управления заданиями JCL (Job Control Language) и направляются в систему пользователями через входные устройства и сетевые коммуникации, а также через ранее запущенные приложения. В задании зашифровано, какие программы, в какой последовательности и с какими данными должны быть исполнены, а также в какой форме и куда должны быть направлены результаты выполнения программ.

    Все множество заданий в z/OS может быть представлено в виде трех групп:

  • пакетные задания (batch job), формируемые пользователями на языке JCL и направляемые на обработку по команде сеанса TSO SUBMIT или через сетевые интерфейсы.
  • STC-задания, инициируемые с помощью консольных команд START и MOUNT и получившие название запускаемые процедуры (started task);
  • TSU-задания, формируемые в результате запуска пользовательских сеансов TSO/E по команде LOGON и предназначенные для поддержки диалога с пользователем.
  • Задания, поступающие в систему от различных источников, образуют поток заданий, обрабатываемый специальным системным компонентом JES.

    При выполнении STC и TSU заданий z/OS создает отдельные адресные пространства для каждой запускаемой процедуры и каждого пользовательского сеанса TSO. Для пакетных заданий новые адресные пространства не создаются, поскольку их выполнение производится в системных адресных пространствах программ-инициаторов, входящих в состав JES.

    Каждое задание характеризуется набором атрибутов, среди которых необходимо выделить:

  • имя (jobname);
  • идентификатор (jobID);
  • класс выполнения или просто класс (class);
  • приоритет (prty).
  • Имя задания - имя, присваиваемое заданию пользователем (для пакетных заданий) или формируемое автоматически (для STC/TSU-заданий). Идентификатор задания - уникальный код (номер) задания, устанавливаемый системой при вводе задания. Именно по идентификатору система отличает одно задание от другого.

    Класс задания устанавливает принадлежность задания к определенной группе в зависимости от формы запуска, атрибутов пользователя и требований к ресурсам. В z/OS поддерживается два специальных класса для STC и TSU заданий и до 36 классов для пакетных заданий. Классы пакетных заданий обозначаются символами A, B, ..., Z и цифрами 0, 1, ..., 9 и могут назначаться по усмотрению пользователей с помощью JCL. Если пользователь не указал класс, система сформирует его в соответствии с настройками по умолчанию.

    Приоритет задания (число в диапазоне 0-15) служит для определения очередности выполнения заданий. Обычно приоритет устанавливается системой автоматически на основе текущих атрибутов задания и может динамически изменяться в зависимости от времени ожидания в очереди. Наивысшему приоритету соответствует значение 15.

    С каждым заданием система ассоциирует два специальных набора данных: SYSIN и SYSOUT. Входной набор данных SYSIN отражает исходные данные, используемые приложениями задания. Эти данные могут быть представлены непосредственно в тексте задания (в этом случае говорят, что исходные данные размещаются во входном потоке ) или содержаться в указанных наборах данных и/или устройствах. Выходной набор данных SYSOUT служит для размещения системных сообщений, а также сообщений и результатов работы, выполняемых в рамках задания программ. Система предоставляет возможность просмотреть и распечатать SYSOUT, который иногда называют отчетом или листингом задания.

    Функции и компоненты подсистемы JES2

    Задания, поступающие в систему от различных источников, принимаются и обрабатываются специальным компонентом z/OS, который называется подсистемой управления заданиями JES (Job Entry Subsystem)Хотя слово entry часто переводят как <вводgt;, здесь его смысл следует трактовать шире.. JES принимает задания (рис. 5.19), поступающие с входных устройств, регистрирует их, осуществляет анализ и формирует очереди заданий, а затем передает задания на выполнение базовой управляющей программе BCP. После завершения выполнения задания и получения результатов от BCP, JES формирует отчет по заданию (листинг), передает его пользователю или выводит на указанные устройства. Чаще всего в установленных конфигурациях z/OS используется базовый компонент управления заданиями JES2, который и будет рассмотрен в данной главе. Альтернативой JES2 является опциональный компонент JES3, который в отличие от JES2 может использоваться для централизованного управления заданиями в многомашинной системе. Отметим, что JES2 работает в собственном адресном пространстве и имеет статус подсистемы (использует специальный SSI-интерфейс для взаимодействия с базовой управляющей программой z/OS). Кроме того, JES2 поддерживает собственные языковые средства, которые можно включать в текст задания (так называемые операторы JECL - Job Entry Control Language) и применять в виде консольных команд (системные команды JES2).

    (рис 5.19) Назначение подсистемы управления заданиями

    На рис. 5.20 представлена схема, иллюстрирующая основные этапы обработки заданий после того, как они направлены в подсистему JES2 .

    (рис 5.20) Этапы обработки заданий

    На этапе ввода (entry phase) осуществляется прием заданий, поступающих в систему от различных источников. Пользователь может задействовать для этих целей терминальные устройства, консоли, сетевые рабочие станции и т.п., применяя консольные команды START, MOUNT, команды TSO/E LOGON и SUBMIT. Существует возможность формировать и направлять задания на обработку из ранее запущенных программ и заданий. Поддерживается возможность удаленного RJE (Remote Job Entry) и сетевого NJE (Network Job Entry) ввода заданий, поступающих от узлов распределенной вычислительной сети. JES2 контролирует все пути поступления заданий с помощью специальных встроенных программ ввода INTRDR (Internal Reader). Текст каждого поступившего задания (предложения JCL и JECL) и вложенные в него входные данные пользователя (обозначаемые как набор данных SYSIN) помещаются в специальный набор данных JES2, называемый "спул" (spool).

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

  • JCL операторы задания и специальные операторы JES2 (JECL);
  • исходные данные, представленные во входном потоке (набор данных SYSIN);
  • выходные данные и сообщения, формируемые в процессе выполнения задания, и подготавливаемые для вывода в отчет (набор данных SYSOUT);
  • управляющая информация JES2;
  • сообщения для вывода в системный журнал SYSLOG.
  • На этапе ввода осуществляется регистрация задания, заключающаяся в присваивании заданию уникального идентификатора (JobID) и занесении учетной и статусной информации в специальный реестр JES2, получивший название очередь заданий (JOBQUEUE). Помимо идентификатора, JOBQUEUE содержит также значения класса, приоритета и текущего состояния задания. Фактически все множество очередей, представленных на рисунке, хранится в одной общей таблице JOBQUEUE. В этом случае выборка заданий производится по значению кода текущего состояния, показывающего, на каком этапе обработки задание находится в данный момент.

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

    На этапе преобразования (conversion phase) сначала производится анализ текста задания и трансляция его в специальный промежуточный код. Если обнаружены синтаксические ошибки, формируется отчет SYSOUT, включающий диагностические сообщения, и задание направляется на этап вывода, минуя стадию выполнения. В процессе анализа при необходимости происходит включение в текст задания и настройка параметров так называемых процедур JCL, вызываемых из внешних библиотек. Процедуры представляют собой готовые блоки предложений JCL, предназначенные для решения типовых пользовательских задач и хранящиеся в специальных наборах данных - библиотеках процедур (на рисунке обозначены как PROC). JES2 располагает настраиваемым списком используемых стандартных библиотек процедур (самая известная среди них - SYS1.PROCLIB). Пользователь также имеет возможность указать собственный набор библиотек процедур с помощью оператора JCLLIB.

    Если ошибки не обнаружены, промежуточный код задания помещается в спул, и задание передается в очередь на стадию выполнения. Следует отметить, что для каждого класса заданий формируется отдельная очередь. Внутри очереди задания упорядочены по приоритетам, назначаемым JES2 на основе установленной политики администрирования.

    На этапе выполнения (execution phase) ключевую роль играют системные программы, получившие название инициаторов (initiators). Обычно запускается несколько инициаторов одновременно, так чтобы один инициатор обслуживал одну или несколько конкретных очередей заданий (по значениям класса). Каждый инициатор работает в собственном виртуальном адресном пространстве в соответствии со следующим алгоритмом:

  • инициатор формирует запрос к JES2 на получение нового задания из очередей обслуживаемых им классов;
  • JES2 анализирует очередь заданий (JOBQUEUE) и передает инициатору сообщение о выбранном в соответствии с приоритетом задании;
  • инициатор считывает из спула промежуточный код задания и входные данные (SYSIN), определяет, какие ресурсы необходимы для выполнения, и открывает соответствующие наборы данных, а также копирует в свое адресное пространство загрузочные модули вызываемых в задании программ;
  • инициатор последовательно передает управление программам задания, контролируя ход их выполнения и поступающие сообщения; реальное управление выполнением программ реализуется базовой управляющей программой (BCP);
  • при завершении задания (нормальном или аварийном) результаты работы программ передаются инициатором в набор данных SYSOUT спула, а задания поступают в очередь на стадию вывода.
  • Отметим, что в z/OS поддерживается два типа инициаторов: инициаторы JES и инициаторы WLM. Инициаторы JES2 обычно запускаются автоматически при инициализации системы в соответствии с настройками JES2 и назначаются на обслуживание определенных классов заданий. Инициаторы WLM запускаются динамически в зависимости от текущей нагрузки системы и в соответствии с установленной политикой управления нагрузкой в целевом режиме.

    Важно подчеркнуть, что для большинства заданий не создаются новые адресные пространства z/OS, поскольку их выполнение происходит в адресных пространствах инициаторов. Исключение составляют задания классов STC и TSU, которые не обрабатываются инициаторами. Для этих классов JES2 самостоятельно создает отдельные адресные пространства для каждого пользовательского сеанса TSO и каждой запускаемой процедуры, а также обрабатывает поступающие сообщения.

    На этапе вывода (output phase) JES2 формирует отчет о выполнении задания в наборе данных SYSOUT в соответствии с требованиями и характеристиками назначенного выходного класса и указанными в задании атрибутами вывода. Выходной класс задания (всего доступно 36 классов, кодируемых символами A-Z или цифрами 0-9) определяется пользователем с помощью параметра SYSOUT оператора DD или оператора OUTPUT либо назначается подсистемой JES2 по умолчанию. Классы служат для группирования заданий с целью использования общих ограничений по выводу отчетов и для целей управления, но никак не связаны с используемыми для вывода устройствами. Подготовленные отчеты направляются в очередь на стадию печати или задерживаются на этапе вывода, если для задания установлен статус HOLD. Данный статус задается пользователем или устанавливается JES2 для некоторого класса или группы заданий. Дальнейшая обработка задержанных заданий производится по специальному указанию оператора (пользователя).

    На этапе печати (hardcopy phase) производится вывод подготовленного отчета из набора данных SYSOUT на указанное пользователем или установленное JES2 выходное устройство (принтер, узел сети и т.п.), и задание передается в очередь на стадию завершения.

    На этапе завершения (purge phase) JES2 осуществляет "очистку" спула и очереди заданий от информации, связанной с выполненным заданием, и формирует соответствующее сообщение.

    Следует напомнить, что в z/OS существует специальный опциональный компонент SDSF, предназначенный для просмотра параметров текущего состояния всех запущенных в системе заданий и отчетов о выполнении, а также предоставляющий возможность изменять некоторые параметры и управлять ходом выполнения заданий динамически.

    Структура пакетного задания JCL

    Итак, прежде чем передать пакетное задание системе, пользователь должен подготовить его текст на языке JCL. Обычно текст задания создается в некотором наборе данных с помощью текстового редактора, откуда специальными средствами пользовательского интерфейса его можно направить на обработку в подсистему JES2. z/OS требует, чтобы для представления заданий использовались только последовательные и библиотечные наборы данных с параметрами RECFM=FB и LRECL=80. Текст задания вводится, как правило, прописными буквами.

    Задание состоит из последовательности управляющих предложений JCL (job control statement)Иногда предложения JCL называют <картами> задания (job cards), вспоминая о тех временах, когда текст задания готовился на перфокартах. Оттуда, кстати, унаследовано ограничение строки задания в 80 символов.. Каждое предложение имеет следующую структуру:

    //ИМЯ ОПЕРАТОР ОПЕРАНДЫ КОММЕНТАРИЙ

    В первых двух позициях всегда (или почти всегда) указываются две косые черты (знак слэш / ), которые являются главным отличительным признаком предложений JCL.

    Поле имя начинается с третьей позиции и служит для идентификации представленного в предложении оператора. Фактически это метка, на которую можно ссылаться из различных предложений задания или других заданий. Имя может содержать не более восьми символов, включающих латинские буквы, цифры и специальные знаки ( $ # @ ). Имя должно начинаться с буквы или специального знака, русские буквы и пробелы использовать нельзя. В некоторых специальных случаях применяют составные имена, использующие в качестве разделителя точку. Пробел в третьей позиции является признаком отсутствия имени.

    Примеры правильных имен: STOUT1, SYSPRINT, IVANOV, IVAN#S

    Примеры неправильных имен: 3DIAGNOZ (начинается с цифры), DIAGNOSTIKA (содержит более восьми символов), ТОМ+И (содержит недопустимый символ И ).

    Вслед за полем имени следуют другие поля, отделяемые друг от друга одним или несколькими пробелами.

    Основные операторы JCL
    ОператорНазначение оператора
    JOB Начало задания и режим выполнения задания
    EXEC Начало шага задания, указание выполняемой программы или процедуры
    DD Описание набора данных и используемых устройств
    COMMAND Ввод системной (консольной) команды MVS или команды JES
    PROC Начало процедуры и описание параметров процедуры
    PEND Конец процедуры
    JCLLIB Список библиотек для поиска процедур, указанных в задании
    OUTPUT Параметры формирования отчета о выполнении задания (SYSOUT)
    INCLUDE Имя раздела библиотеки, текст которого необходимо включить в указанное место задания
    CNTL/ENDCNTL Начало и конец блока управляющих параметров, передаваемых программе во входном потоке
    IF/THEN/ELSE/ENDIF Условное выполнение шагов задания (ветвление)
    SET Инициализация или изменение значений символических параметров
    /* Оператор ограничения данных, представленных во входном потоке
    // Пустой оператор (конец задания)
    //* Оператор комментария

    Поле оператор определяет тип управляющего оператора JCL, который задается одним из ключевых слов, представленных в таблица 5.4. Назначение и использование основных операторов ( JOB, EXEC, DD ) будет рассмотрено в данной главе.

    Поле операнды предложения JCL содержит список разделенных запятыми параметров, которые записывают вслед за именем оператора (через один или несколько пробелов). С помощью параметров сообщают информацию, необходимую для выполнения оператора. Различают позиционные и ключевые параметры.

    Позиционные параметры часто имеют произвольный формат записи, но всегда указываются в строгой последовательности и всегда перед ключевыми параметрами. Если позиционный параметр опускается, то запятая, которая должна следовать за параметром, остается (исключение составляет случай, когда опускается последний параметр в списке позиционных параметров). Примеры записи позиционных параметров:

    333,TEST,,0.8E-15 NEW,,DELETE

    Ключевые параметры задаются с использованием предопределенных ключевых слов в виде: ключевое_слово=значение. Например, CLASS=B, REGION=100M, COND=(1,LE). Последовательность записи ключевых параметров - произвольная.

    Отдельные параметры могут включать подпараметры, которые также задают в виде списка, заключенного в апострофы или круглые скобки. Как и параметры, подпараметры могут быть позиционными и ключевыми. Скобки или апострофы опускаются, если в списке указывается один подпараметр. Например:

    DISP=(NEW,,DELETE) - позиционные подпараметры параметра DISP

    DCB=(RECFM=FB,LRECL=80) - ключевые подпараметры параметра DCB

    В поле комментарий предложения JCL помещают произвольную текстовую информацию, поясняющую назначение или особенности использования отдельных операторов. Отметим, что для этой цели может применяться специальный оператор комментария //*. Этот текст не обрабатывается при выполнении задания.

    Поля предложений JCL не должны выходить за пределы 71-й позиции строки. Если же текст предложения не умещается в одной строке, то его (кроме предложения комментария //* ) разрешается продолжить на следующей. При этом если необходимо перенести на следующую строку некоторые параметры из списка, то следует соблюдать такие правила:

  • Разрыв строки необходимо сделать точно в том месте, где располагается разделительная запятая списка параметров.
  • В следующей строке в позициях 1 и 2 нужно указать символы //. Продолжить ввод списка параметров, начиная не ранее 4-й, но не позднее 16-й позиции строки.

    Вот как выглядит запись многострочного предложения JCL:

    //OUT DD UNIT=SYSDA,VOL=SER=UB1,
    // DISP=NEW,SPACE=(1000(5,4)),
    // DSN=TEMP1
  • Исключением из этого правила является ситуация, когда перенос требует "разорвать" параметр, заключенный в апострофы. В этом случае следует вводить текст предложения до 71-й позиции включительно, а продолжение располагать точно с 16-й позиции следующей строки.

    Структуру задания в z/OS схематично можно представить в виде последовательности операторов (рис. 5.21). Первым всегда указывается оператор задания JOB, который отмечает начало задания. Непосредственно за оператором JOB могут следовать другие операторы ( DD, JCLLIB, OUTPUT ), с помощью которых описывают общие ресурсы задания в целом (наборы данных, библиотеки процедур, параметры вывода результатов).

    (рис 5.21) Структура задания

    Последующие операторы задания группируются по шагам или пунктам. Шаг (пункт) задания (job step) - это последовательность операторов JCL, начинающаяся с оператора EXEC и включающая некоторое количество иных операторов (в основном DD ). Оператор EXEC (его называют иногда оператором шага задания) устанавливает, какую программу (загрузочный модуль) или процедуру JCL необходимо выполнить. С помощью операторов DD в шаге задания описывают наборы данных и/или устройства, используемые при выполнении указанной в операторе EXEC программы (процедуры). Шаги задания выполняются строго последовательно. Однако есть возможность пропуска (невыполнения) некоторых шагов в зависимости от результатов работы предыдущих шагов с помощью операторов IF/THEN/ELSE или параметра COND операторов JOB и EXEC. Общее количество шагов задания не может превышать 255, включая шаги всех вызываемых в задании процедур.

    Далее приводится обзор основных операторов языка управления заданиями, который, однако, не претендует на полноту и не может служить заменой стандартной документации , . Многие операторы и особенности их применения представлены без некоторых деталей, которые могут понадобиться при практическом использовании JCL. При описании формата операторов используются привычные мнемонические правила:

  • информация, заключенная в квадратные скобки, является необязательной и может быть опущена;
  • символ | используется для указания альтернативных значений, из которых следует выбрать одно.
  • Нужно отметить, что язык JCL достаточно подробно описан в отечественной литературе , , , в том, правда, виде, в каком он сложился к началу 90-х годов.

    Оператор JOB

    Оператор задания JOB всегда располагается в начале задания и служит для определения основных пользовательских атрибутов задания, таких как класс, приоритет, время выполнения и др. Последовательность символов, указанная в поле имени предложения JOB, рассматривается как имя задания и должна присутствовать в обязательном порядке. Кроме того, в операторе JOB может быть определена учетная информация, параметры безопасности и производительности и некоторые другие.

    Формат оператора JOB:

    //имя JOB параметры
    Позиционные параметры:
        [(учетная информация)][,идентификатор программиста]
    Ключевые параметры:
        [,MSGLEVEL = (предложения,сообщения)]
        [,CLASS = класс задания]
        [,MSGCLASS = класс сообщений]
        [,REGION = nK | nM]
        [,ТIМЕ = (минуты, секунды)]
        [,COND=((код_завершения,условие)[,(код_завершения,условие)])

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

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

    Идентификатор программиста (до 20 символов) служит для идентификации пользователя, подготовившего задание. В качестве идентификатора можно указать фамилию и имя (инициалы) автора задания, номер отдела, в котором он работает, шифр темы, название организации и т.п. Если в идентификаторе используются русские буквы или пробелы, то его следует заключать в апострофы.

    Варианты записи учетной информации и идентификатора программиста могут выглядеть так:

    //PR1 JOB 5,'ИВАНОВ И.Л.'
    //PR2 JOB (5,А1),'ПЕТРОВ В.А.'
    //PR3 JOB 'T801,378',BOB
    //PR4 JOB ,'сидоров'
    //PR5 JOB 840,PETROV
    //PR6 JOB ,'KOBZON I.D.'

    Параметр MSGLEVEL (уровень полноты сообщений) определяет, какую информацию необходимо выдать в отчет о выполнении задания, и имеет следующий формат:

    MSGLEVEL=(a,b)

    Подпараметр a может принимать три значения: 0, 1 и 2. Если программист указал цифру 0, то в отчет выводится только оператор JOB. Значение 2 указывает, что требуется вывод всех операторов задания и операторов JECL, а цифра 1 определяет, что нужно выводить не только все операторы задания, но и операторы вызываемых процедур после замены в них символических параметров фактическими значениями.

    Подпараметр b может принимать два значения: 0 и 1. Значение 1 предписывает всегда выводить в отчет связанные с выполнением задания сообщения, инициируемые оператором, интерпретатором JCL, JES и подсистемой управления данными DFSMS. Значение 0 указывает, что в отчет будут включены только сообщения интерпретатора JCL. Если параметр MSGLEVEL опущен, то по умолчанию принимаются значения, установленные в настройках JES. Примеры:

    //GOD JOB ,,MSGLEVEL=(1,1)
    //ST     JOB    I,STUPIN,MSGLEVEL=2
    //ST     JOB    ,JOHN,MSGLEVEL=(,1)

    Во втором примере подпараметр b, а в третьем - подпараметр a будут установлены по умолчанию.

    Параметр CLASS (класс) относит задание к определенному классу выполнения заданий и задается символами A-Z, 0-9. Если класс не указан, то принимается значение, установленное в настройках JES в зависимости от источника задания.

    Пример:

    //U01A JOB 21,TOMA,CLASS=В

    Параметр MSGCLASS (класс сообщений) определяет выходной класс для системных сообщений, формируемых в процессе выполнения задания. Класс задается символами A-Z, 0-9. Параметр MSGCLASS дает возможность выводить все системные сообщения и выходные наборы данных, формируемые в шагах задания, в один и тот же класс или в разные классы. Такое разделение иногда может оказаться полезным.

    Пример. Предусмотреть вывод всех управляющих операторов задания и сообщений отдельно от выходных наборов данных:

    //U JOB (5.1),'ПЕТР',MSGLEVEL=(1,1),CLASS=B,MSGCLASS=С
    //STl EXEC PGM=PRINT
    //OUT DD SYSOUT=A

    Здесь для выполнения задания предусмотрен класс В, для вывода результатов шага задания (параметр SYSOUT оператора DD ) - класс А, а для вывода системных сообщений - класс С.

    Параметр REGION (область) задает максимальный размер области виртуальной памяти в пользовательском регионе, которую необходимо выделить для выполнения каждого шага задания. Параметр REGION задается в виде:

    REGION=nК | nМ

    где n - целочисленное значение, определяющее число килобайт (K) или мегабайт (M) виртуальной памяти. Например, если указать REGION = 900К, то шагам задания будет отводиться по 900 килобайт. Максимальное значение параметра в килобайтах - 2 096 128, в мегабайтах - 2047. Значение 0К или 0М означает, что задание требует в свое распоряжение всю приватную часть виртуального адресного пространства. Если параметр REGION в операторе JOB опущен, то используется значение, указанное в операторах EXEC. Если и в этих операторах он не задан, то принимается стандартное значение, заданное в настройках JES. Отметим, что с помощью параметра ADDRSPC, указываемого дополнительно, можно потребовать выделить для задания с помощью параметра REGION область реальной памяти ( ADDRSPC=REAL ).

    Параметр TIME (время) устанавливает максимальную продолжительность выполнения задания и имеет формат:

    ТIМЕ=(мин,сек)|мин|1440|NOLIMIT

    Время указывается в минутах и секундах либо только в минутах. Если секунды не указаны, можно не использовать скобки. Например, запись TIME = 30 означает, что заданию требуется выделить 30 минут процессорного времени. Число минут может быть не более 1440 (т.е. 24 часа), а секунд - не более 60. Если по истечении времени, указанного в TIME, задание не завершило работы, то система либо принудительно завершает задание, либо использует средства специальной обработки "просроченных" заданий. По умолчанию, когда параметр TIME не задан, ограничение на выполнение задания определяется настройками JES. Если в параметре TIME указать число 1440 или слово NOLIMIT, то время выполнения задания считается неограниченным.

    Варианты описания времени выполнения задания:

    //PRIMER1 JOB ,,TIME=10
    //PRIMER2 JOB ,,TIME =(10,30)
    //PRIMER3 JOB ,,TIME =(,30)

    Задание PRIMER1 выполняется не более 10 мин, задание PRIMER2 - не более 10 мин и 30 с, а задание PRIMER3 - 30 с.

    Параметр COND (от condition - условие) задает условия, при которых следует прекратить выполнение задания, если полученный на каком-либо шаге результат не устраивает пользователя. Для управления выполнением шагов задания используют коды завершения. Код завершения или код возврата (RC от Return Code) формируется выполняемой в шаге задания программой и может характеризовать "успешность" выполнения программы в зависимости от полученного результата. Например, для многих системных программ z/OS принято использовать следующие значения кодов завершения:

    0 - при обработке программы ошибок не обнаружено (успешное выполнение);

    4 - обнаружены несущественные ошибки, выдается предупреждающее сообщение, но выполнение программы было продолжено;

    8 - обнаружены ошибки, которые могут привести к невозможности выполнения задания (выдается сообщение об ошибках);

    12 - обнаружены серьезные ошибки, дальнейшая обработка программы невозможна (выдается сообщение о серьезной ошибке);

    16 - обнаружены ошибки, которые делают невозможным выполнение программы (выполнение программы прекращается).

    Используется следующий формат записи параметра COND:

    COND=((код_завершения,условие)[,(код_завершения,условие)_])

    Допустимое значение подпараметра код_завершения указывается в виде целого числа в диапазоне от 0 до 4095. Подпараметр условие задает условие проверки кода завершения мнемоническим отношением вида: GT - больше, чем, GE - больше или равно, EQ - равно, LT - меньше, чем, LE - меньше или равно, NE - не равно.

    Если заданное отношение к коду возврата, выработанному программой, которая вызывается оператором EXEC, не соблюдается, то выполнение задания прекращается. Внешние скобки можно опустить, если задано только одно условие. Условие, задаваемое параметром COND, проверяется перед выполнением каждого шага задания следующим образом: если код возврата, полученный на одном из предыдущих шагов, соответствует условию, то выполнение задания прекращается. Например, запись COND=(0,NE) предписывает прекратить выполнение задания, если окажется, что код завершения одного из шагов не равен нулю. В записи COND=(4,LT) указано, что если 4 меньше полученного кода завершения, то шаги задания не выполняются. Условие COND=((50,GE),(70,LE)) предписывает, что если 50 больше или равно коду возврата или 70 меньше или равно коду возврата, то оставшиеся шаги задания не выполняются. Таким образом, здесь задание будет выполняться до тех пор, пока код возврата находится в диапазоне от 51 до 69.

    Если параметр COND опущен, то проверка кода возврата не производится.

    Оператор EXEC

    Оператор выполнения EXEC (его также называют оператором шага задания) служит для указания программы или процедуры JCL, которую необходимо выполнить, а также для установления параметров выполнения шага. В задании должен присутствовать как минимум один оператор EXEC, но их может быть и несколько.

    Формат оператора EXEC:

    //[имя_шага_задания] EXEC позиционный параметр 
                              [,ключевые параметры]
    
        Позиционный параметр:
    
    PGM = имя_программы | *.имя_шага.имя_DD
    [PROC=]имя_процедуры
        Ключевые параметры:
    [,PARM = (значение, значение,...)]
    [,REGION = nК | nM]
    [,ТIМЕ = (мин,сек)]
    [,COND=((код_завершения,условие[,имя_шага]),...,[EVEN|ONLY])]
    ...

    Напомним: как и ранее, квадратные скобки означают, что параметр необязателен. Таким образом, единственным обязательным параметром оператора EXEC является позиционный параметр, задающий выполняемую программу (через ключевое слово PGM ) или процедуру (через ключевое слово PROC или без него), остальные параметры необязательны. Необязательно и имя шага задания, однако при его отсутствии могут возникнуть трудности анализа сообщений системы (неясно, к какому шагу задания они относятся), а также невозможно будет сделать ссылку на данный шаг задания.

    Параметр PGM определяет программу, которая должна быть выполнена в данном шаге задания. Например:

    //EXEPRIM1 EXEC PGM=MYPROG

    Вызываемая программа задается по имени раздела библиотечного набора данных, содержащего соответствующий загрузочный модуль. z/OS устанавливает определенный порядок поиска загрузочных модулей. По умолчанию поиск ведется в системных библиотеках загрузочных модулей, список которых определен в разделе LNKLST реестра SYS1.PARMLIB. Первой в этом списке обычно стоит библиотека SYS1.LINKLIB. В системных библиотеках находятся наиболее часто используемые программы общего назначения. Однако можно настроить задание на выборку загрузочных модулей из личных библиотек - библиотечных наборов данных, в которых хранятся программы пользователей. Личные библиотеки должны быть явно описаны в задании с помощью операторов DD с зарезервированными для этой цели именами JOBLIB или STEPLIB. Рассмотрим пример:

    //JOBA1 JOB (A21,DEP3,007),,CLASS=C
    //JOBLIB DD DSN=USERLIB1,DISP=SHR
    //STEP1 EXEC PGM=PRG1
    //STEP2 EXEC PGM=PGM2
    //STEPLIB DD DSN=USERLIB2,DISP=SHR

    В задании определены две личные библиотеки: библиотека задания USERLIB1, описанная с помощью оператора DD с именем JOBLIB, и библиотека шага задания USERLIB2, описанная с помощью оператора DD с именем STEPLIB. В этом случае поиск программы PRG1 будет производиться в следующем порядке: USERLIB1, библиотеки списка LNKLST, а поиск программы PRG2 - сначала USERLIB2 (так как именно в этом шаге описана данная библиотека), затем USERLIB1 и, наконец, библиотеки LNKLST.

    Если позиционный параметр описан как PGM=*.имя_шага.имя_DD, то программа вызывается из библиотеки загрузочных модулей, описанной в одном из предыдущих шагов задания. Здесь имя_DD - это имя оператора DD, в котором описывается библиотека загрузочных модулей, имя_шага указывает шаг задания, в котором находится упомянутый оператор DD. В приведенном ниже примере в шаге ST2 будет выполнена программа, загрузочный модуль которой хранится в разделе CALC библиотеки MYLIB, как указывает ссылка *.ST1.DSPROG:

    //ST1 EXEC PGM=MYPROG
    //DSPROG DD DSNAME=MYLIB(CALC),DISP=SHR
    //ST2 EXEC PGM=*.ST1.DSPROG

    Второй формат позиционного параметра оператора EXEC с использованием ключевого слова PROC или без него служит для выполнения процедуры в шаге задания. Процедура представляет собой последовательность операторов JCL, оформленных как автономная JCL-программа. Процедура может храниться в системной или пользовательской библиотеке процедур либо описывается непосредственно в задании. Список используемых системных библиотек процедур определяется системным программистом в настройках JES. Особенности использования и вызова процедур будут описаны ниже.

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

    Параметр PARM служит для передачи программе, выполняемой в шаге задания, определенной управляющей информации или исходных данных. Эта информация передается в виде текстовой строки длиной не более 100 символов, которая обычно включает ряд значений (подпараметров), разделенных запятыми. Если через PARM передается список значений, то весь список должен заключаться в апострофы или круглые скобки. Приведем примеры различных вариантов определения параметра PARM:

  • передача одного параметра:
    //STEP1 EXEC PGM=PR1,PARM=12
    //STEP2 EXEC PGM=PR1,PARM=LOAD
  • передача двух параметров:
    //STEP3 EXEC PGM=PR1,PARM=(LIST,NODECK)
    //STEP4 EXEC PGM=LOADER,PARM ='MAP,SIZE=150K'
    //PR1 EXEC PROC=РЕЗ,PARM='2000,YES'
  • Подпараметры, содержащие специальные знаки (например, русский текст, знак + и т. п.), следует заключать в апострофы или круглые скобки. Если апостроф встречается в подпараметре, то он повторяется дважды, например PARM = 'О''К!'. Информация, заключенная в апострофы, должна умещаться на одной строке, а заключенная в скобки может быть перенесена на другую строку.

    Параметры REGION и TIME аналогичны параметрам оператора JOB с той лишь разницей, что в EXEC они определяют размер области виртуальной памяти и время выполнения для шага задания. Параметр TIME оператора JOB имеет преимущество перед параметром TIME оператора EXEC: если время, указанное параметром TIME оператора EXEC, превосходит время, установленное параметром TIME оператора JOB, то значение параметра TIME оператора EXEC игнорируется. Параметр REGION в операторе EXEC также игнорируется, если задан параметр REGION в операторе JOB. Примеры:

    //SI EXEC PGM=A,REGION=40K
    //INT1 EXEC PGM=PR1,TIME=5
    //INT2 EXEC PGM=PR1,TIME=(,45)

    Параметр COND определяет условия для обхода шага задания. Он указывает, что возможность выполнения шага задания зависит от полученных значений кодов завершения на предшествующих шагах задания. Синтаксис параметра COND несколько отличается от аналогичного параметра оператора JOB:

    COND = ((код_завершения,условие[,имя_шага])... [,EVEN|,ONLY])

    Здесь наряду с подпараметрами код_завершения и условие, можно указывать имя одного из предыдущих шагов задания, по коду завершения которого будет вестись проверка ( имя_шага ). Если имя_шага не указано, условие будет проверяться для всех предыдущих шагов. Подпараметры EVEN и ONLY следует использовать, когда выполнение текущего шага требуется поставить в зависимость от наличия в задании аварийно завершенных шагов (для таких шагов код завершения не сформирован). Подпараметр EVEN требует выполнять текущий шаг, даже если один из предыдущих шагов завершился аварийно, ONLY - только если один из предыдущих шагов завершился аварийно.

    Параметр COND может содержать до восьми условий, включая EVEN и ONLY. Шаг задания не будет выполнен, если соблюдается хотя бы одно из заданных условий. Рассмотрим ряд примеров:

  • шаг ST3 не выполняется, если 8 > RC шага ST1:
    //ST3 EXEC PGM=PROG3,COND=(8,GT,ST1)
  • шаг ST6 не выполняется, если 8 $$\le$$ RC шага ST1 или 8 $$\le$$ RC шага ST2:
    //ST6 EXEC PGM=AP,COND=((8,LE,ST1),(8,LE,ST2))
  • шаг ST9 не выполняется, если 16 $$\ge$$ RC всех предыдущих шагов, или 90 $$\le$$ RC шага ST2, или ни один из предыдущих шагов не завершился аварийно:
    //ST9 EXEC PGM=AP,COND=((16,GE),(90,LE,ST2),ONLY)
  • шаг ST7 не выполняется, если 10 $$\le$$ RC шага ST5, в противном случае шаг будет выполнен, даже если один из предыдущих шагов завершился аварийно:
    //ST7 EXEC PGM=AP,COND=((9,LT,ST5),EVEN)
  • Оператор DD

    Оператор описания данных DD (data definition) - это оператор определения данных и устройств, используемых в задании и его отдельных шагах. Операторы DD, относящиеся к определенному шагу задания, следуют за оператором EXEC этого шага задания. В одном шаге задания может быть описано не более 3273 операторов DD. Оператор DD может располагаться также за оператором JOB, если требуется описать наборы данных, общие для всего задания (например, библиотеки загрузочных модулей и др.).

    Оператор DD может содержать один позиционный и около 60 ключевых параметров. Познакомимся с некоторыми наиболее важными из них, исключив из рассмотрения параметры, используемые для описания SMS и VSAM наборов данных.

    Формат оператора DD:

    //имя DD [позиционный параметр][,ключевые параметры]
        Позиционный параметр:
    * | DATA | DUMMY
        Ключевые параметры:
    [,DSN[AME] = имя_набора_данных]
    [,DCB = (список подпараметров)]
    [,UNIT = устройство]
    [,VOL[UME] =(список подпараметров)]    
    [,SPACE = (список подпараметров)]
    [,DISP = (список подпараметров)]
    [,SYSOUT = (список подпараметров)]
    [,LABEL = (список подпараметров)]
    ...

    Важнейшим атрибутом оператора DD является имя, связывающее описываемый набор данных с кодом вызываемой программы. Как отмечалось в п.5.1.3, в программе для каждого используемого набора данных с помощью макровызова DCB устанавливается так называемое dd-имя (ddname). Если в шаге задания указать оператор DD с таким же именем, то появляется возможность определить или изменить ряд параметров указанного набора данных через оператор DD задания, то есть в момент запуска программы. Таким образом, при выполнении любой программы пользователь должен в первую очередь выяснить, какие dd-имена следует применять для описания данных и устройств, необходимых для ее работы. Это можно сделать с помощью соответствующей документации и руководств. Например, для программы-компилятора языка ассемблера установлены следующие dd-имена:

    SYSIN - для описания исходного модуля;

    SYSPRINT - для вывода сообщений компилятора;

    SYSLIN - для описания объектного модуля;

    SYSUT1 - промежуточный набор данных.

    Некоторые имена операторов DD зарезервированы системой для специальных целей. К ним относятся, например, следующие имена:

    JOBLIB - для описания личной библиотеки загрузочных модулей, доступной заданию;

    STEPLIB - для описания личной библиотеки загрузочных модулей, доступной для шага задания;

    SYSABEND - для выходного набора данных, в который может быть записан дамп системного ядра и области памяти обрабатывающей программы, если шаг задания завершился аварийно;

    SYSUDUMP - для выходного набора данных, в который может быть записан дамп области памяти обрабатывающей программы, если шаг задания завершился аварийно;

    SYSCHK - для выходного набора данных контрольной точки;

    SYSIN - для входного набора данных ввода заданий;

    SYSPRINT - для набора данных, выводимого на печатающее устройство;

    При использовании процедур могут применяться составные имена операторов DD, о чем речь пойдет немного ниже.

    Только в одном случае у оператора DD может отсутствовать имя: при описании сцепленных наборов данных, рассматриваемых системой как единый набор данных:

    //SCHETA  DD ...
    //        DD ...
    //        DD ...

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

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

    *.имя_DD

    или

    *.имя_шага_задания.имя_DD

    Первый формат используется при ссылке внутри шага задания, а второй формат применяется при ссылке на один из предшествующих шагов задания. Например:

    //PR  JOB SECT
    //ST1 EXEC PGM=SUN1
    //UT1 DD DSNAME=LIB1,DCB=(RECFM=FB,LRECL=80,BLKSIZE=400)
    //UT2 DD DSNAME=LIB2,DCB=*.UT1
    //ST2 EXEC PGM=SUN2
    //GO  DD DSNAME=LIB3,DCB=*.ST1.UT1

    Теперь рассмотрим позиционный параметр оператора DD, который может принимать одно из трех взаимоисключающих значений:

    * | DATA | DUMMY

    Первое значение (*) служит для описания данных, размещаемых во входном потоке, то есть непосредственно в тексте задания вслед за оператором DD. Данные могут занимать одну или несколько строк задания и завершаться ограничительным оператором /*. В некоторых случаях ограничительный оператор может быть опущен. Признаком конца набора данных является в этом случае первый встретившийся управляющий оператор JCL с символами // в первых двух позициях строки.

    Пример:

    //SYSIN DD *
    1 ИВАНОВ 12345 7.9
    2 ПЕТРОВ 67890 3.8
    3 СИДОРОВ 73452 9.0
    /*

    Если же входные данные включают управляющие операторы JCL, то есть строки, содержащие в первых двух позициях //, то необходимо вместо * использовать параметр DATA. В приведенном ниже примере в качестве входных данных определены две строки, содержащие предложения JOB и EXEC:

    //MYJCL DD DATA
    //USER1A JOB ,BOB,MSGLEVEL=1
    //ST1 EXEC IEFBR14
    /*

    Если во вводимых во входном потоке данных должны содержаться строки, начинающиеся с символов /*, то в этом случае можно определить другой ограничитель с помощью параметра DLM. В частности, при компиляции C/C++ приложений можно использовать этот прием следующим образом:

    //PR     JOB SECT
    //ST1 EXEC PGM=CCNDRVR
    //COMPILE DD *,DLM=<>
    # include <stdio.h>
    /*комментарий*/
    main();
    ...
    <>

    Здесь двухсимвольное значение <> в первых двух позициях строки служит для ограничения входного набора данных подобно /*.

    Следует обратить внимание, что по умолчанию JES принимает для вводимого таким образом набора данных значения LRECL=BLKSIZE=80.

    Значение позиционного параметра DUMMY применяется, чтобы объявить некоторый набор данных как фиктивный. В этом случае система не производит никаких действий над набором данных. Например, предложение

    //SYSPRINT DD DUMMY

    обеспечивает подавление вывода сообщений, направляемых программой в набор данных с dd-именем SYSPRINT.

    Рассмотрим ключевые параметры оператора DD.

    Параметр DSNAME (допускается сокращенная запись DSN ) определяет имя набора данных (простое или составное), например:

    //BIBL DD DSNAME=LIB1    
    //SYSIN DD DSN=D.USER1.DATA

    Для указания раздела библиотеки в скобках записывают имя раздела:

    //LOAD DD DSN=USERLIB(PROG1)
    //XXX DD DSN=MY.JCL(JOBTEST)

    Перед именем временного набора данных записывают два знака амперсанда :

    //SYSLIN    DD DSN=LOADSET(GO)
    //SYSUT1    DD DSN=SYSUT1

    Временные наборы данных автоматически уничтожаются системой после завершения шага задания. Отсутствие в операторе DD параметра DSNAME также означает, что набор данных временный. В этом случае имя набора данных будет сгенерировано автоматически, например, так:

    SYSxxxxx.Txxxxxx.RA000.jobname.Rxxxxxx

    где x - определенным образом сформированные цифры и символы.

    В качестве значения параметра DSNAME можно указывать ссылки на другие операторы DD в формате *.имя_DD или *.имя_шага.имя_DD.

    //STFG EXEC PGM=PROG1
    //SYSUT1 DD DSN=DATA.IN
    ...
    //SYSLIN DD DSN=*.STFG.SYSUT1

    Параметр DISP (диспозиция) определяет исходное состояние набора данных, а также действия, которые необходимо произвести с набором данных после завершения шага задания или всего задания: сохранить, уничтожить, каталогизировать и др. Формат записи параметра DISP включает три позиционных подпараметра:

    DISP=([статус][,дисп_НЗ][,дисп_АЗ])

    где статус - исходное (текущее) состояние набора данных, дисп_НЗ - действие при нормальном завершении шага задания, дисп_АЗ - действие, которое надлежит выполнить при аварийном завершении шага задания.

    Подпараметр статус может принимать следующие значения:

    NEW - в указанном шаге задания создается новый набор данных;

    OLD - набор данных существует (создан ранее);

    SHR - набор данных существует и может быть использован одновременно другим заданием, т.е. разделяется различными заданиями в режиме чтения;

    MOD - набор данных существует и будет модифицироваться в указанном шаге задания (используется только для последовательных наборов данных).

    Подпараметры диспозиции дисп_НЗ и дисп_АЗ могут принимать следующие значения:

    DELETE - набор данных следует уничтожить;

    KEEP - набор данных следует сохранить;

    CATLG - набор данных следует сохранить и каталогизировать;

    UNCATLG - набор данных нужно сохранить, но при этом исключить из системного каталога.

    PASS - набор данных следует передать для использования в последующем шаге того же задания.

    Последнее значение ( PASS ) может быть использовано только для подпараметра дисп_НЗ.

    Примеры задания диспозиции:

  • DISP=(NEW,KEEP,DELETE) - набор данных создается и будет сохранен при нормальном завершении и удален при аварийном завершении шага задания;
  • DISP=(SHR,KEEP,UNCATLG) - набор данных существует и будет сохранен при нормальном завершении и исключен из каталога при аварийном завершении шага задания.
  • Допускается не указывать некоторые или даже все подпараметры, учитывая следующие правила формирования их значений по умолчанию:

  • если не указан первый подпараметр ( статус ), то принимается значение NEW ;
  • если не указан второй подпараметр ( дисп_НЗ ), то принимается значение DELETE для нового и KEEP для существующего набора данных;
  • если не указан третий подпараметр ( дисп_АЗ ), то принимается значение, заданное для второго подпараметра ( дисп_НЗ );
  • если не указан параметр DISP, то принимаются значения (NEW,DELETE,DELETE), то есть набор данных создается и уничтожается во время выполнения шага задания (временный).
  • Примеры:

    DISP=(NEW,KEEP) и DISP=(,KEEP) соответствует DISP=(NEW,KEEP,KEEP)
    DISP=NEW и DISP=(NEW,,DELETE) соответствует 
                                  DISP=(NEW,DELETE,DELETE)
    DISP=OLD соответствует DISP=(OLD,KEEP,KEEP)
    DISP=(OLD,,DELETE) соответствует DISP=(OLD,KEEP,DELETE)
    DISP=(SHR,,KEEP) соответствует DISP=(SHR,KEEP,KEEP)

    Параметр UNIT назначает набору данных устройство ввода-вывода и определяется в большинстве случаев одним из трех значений (см. п. 5.1.3):

    UNIT=адрес | типовое_имя | групповое_имя

    Подпараметр адрес задает трех- или четырехразрядный физический адрес устройства (в шестнадцатеричном представлении). Подпараметр типовое_имя задает устройство по установленному производителем оборудования номеру модели, однозначно указывающему на тип устройства. Подпараметр групповое_имя определяет устройство через логическое имя устройства или группы устройств, задаваемое системным программистом на этапе конфигурирования оборудования с помощью компонента HCD в таблице EDT. Ниже приведены примеры задания параметра UNIT различными способами:

    //AD DD UNIT=220 - адрес устройства
    //TD DD UNIT=3390 - типовое имя
    //GD DD UNIT=SYSDA - групповое имя
    //GD DD UNIT=VIO - набор данных в виртуальной памяти

    Параметр VOLUME (сокращенно VOL ) указывает том или тома, на которых размещается набор данных. Рассмотрим наиболее употребительные варианты использования данного параметра.

    В первом варианте том определяется посредством задания серийного имени тома в виде:

    VOL=SER=имя[,имя]...

    Например:

    //DSETl DD DSN=YS,UNIT=SYSDA,VOL=SER=PTOM01

    Здесь описан набор данных YS, находящийся на устройстве, принадлежащем к группе SYSDA с серийным номером тома PTOM01. Для многотомных наборов данных следует указывать список имен.

    Во втором варианте том задается через ссылку, определяемую одним из трех способов:

    VOL=REF=имя_набора_данных | *.имя_DD |.имя шага.имя_DD

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

    //STEP1 EXEC PGM=....
    //DD1 DD DSN=OLD.DATASET,DISP=SHR
    //DD2 DD DSN=DSET1,DISP=(,CATLG,DELETE),VOL=REF=*.DD1
    //STEP2 EXEC PGM=...
    //DD3 DD DSN=DSET2,DISP=(,CATLG),VOL=REF=*.STEP1.DD1

    Здесь создаваемые наборы данных DSET1 и DSET2 будут размещены на том же томе, что и существующий набор данных с именем OLD.DATASET.

    Параметр DCB устанавливает характеристики логической организации набора данных, фиксируемые в блоке управления данными (Data Control Block), который создается системой для каждого набора данных. Блок управления данными представляет собой таблицу, которая после открытия заполняется информацией из описания набора данных в программе и дополняется данными из соответствующего оператора DD. Параметр DCB обычно имеет формат:

    DCB=(список подпараметров)

    Все подпараметры DCB являются ключевыми. Перечислим основные из них:

  • DSORG - тип организации набора данных;
  • RECFM - формат записей;
  • LRECL - длина логической записи;
  • BLKSIZE - длина блока;
  • BUFNO - число буферов ввода-вывода, выделяемых набору данных;
  • BUFL - размер каждого буфера в байтах.
  • Подпараметр RECFM может принимать следующие значения: F - записи фиксированной длины; V - записи переменной длины; U - записи неопределенной длины. Выбор типа записи определяет пользователь. Если он группирует записи в блоки, то указывает это, добавляя к символу формата букву В. Например, указание RECFM=FB означает, что сблокированные записи имеют фиксированную длину.

    Примеры:

  • Набор данных состоит из записей фиксированной длины по 128 байт, которые объединяются в блоки по четыре записи в каждом:
    DCB=(RECFM=FB,LRECL=128,BLKSIZE=512)
  • Набор данных содержит неблокированные записи фиксированной длины по 80 байт:
    DCB=(BLKSIZE=80,RECFM=F)
  • Вместо ключевых подпараметров DCB можно записать ссылку на другой оператор DD, причем некоторые подпараметры можно переопределить заново:

    //ST1 DD DSN=VAX,DCB=(RECFM=VB,LRECL=64,BLKSIZE=640)
    //PRINT DD DCB=(*.ST1,BLKSIZE=128)

    Здесь подпараметры набора данных для параметра DCB копируются из оператора DD с именем ST1, кроме размера блока, который задается непосредственно.

    Параметр SPACE задает требуемый объем памяти для размещения создаваемого набора данных на жестком диске, то есть набора данных с диспозицией NEW. Обычно этот параметр записывают в виде:

    SPACE=(размер[,(количество[,приращение][,оглавление])][,RLSE])

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

    TRK - блок соответствует физической дорожке диска;

    CYL - блок соответствует цилиндру диска;

    число - определяет значение размера блока в байтах.

    Так, параметр SPACE=(CYL,10) определяет область дисковой памяти размером 10 цилиндров, а параметр SPACE=(800,30) объявляет, что требуется память объемом в 30 блоков по 800 байт каждый. Если указанный объем не может быть выделен (диск переполнен), система завершает шаг задания аварийно.

    В том случае когда первоначального объема памяти недостаточно для размещения данных, система может выделить дополнительные блоки памяти, количество которых определяется подпараметром приращение. Установлено, что система может выделять дополнительные блоки не более 15 раз. Так, параметр SPACE=(CYL,(40,5)) запрашивает первоначально 40 цилиндров, а если этого объема памяти будет недостаточно, то система будет выделять по пять цилиндров до 15 раз, т. е. при необходимости всего будет выделено 40+5*15=115 цилиндров. Если приращение не указано, то дополнительные блоки не выделяются.

    Параметр оглавление задается только для наборов данных с библиотечной организацией. Он определяет необходимое количество блоков, отводимых под оглавление библиотечного набора данных. Один блок оглавления содержит 256 байт. Так, например, параметр SPACE=(TRK,(100,10,5)) запрашивает память в 100 дорожек и по 10 дополнительных дорожек (до 15 раз), а также пять блоков по 256 байт оглавления библиотечного набора данных. Отсутствие подпараметра оглавление обычно косвенно указывает на набор данных с последовательной организацией.

    Очевидно, что не всегда удается точно предсказать требуемый для набора данных объем внешней памяти. Подпараметр RLSE служит для освобождения памяти, выделенной, но не использованной под размещение данных. Освобождение свободной памяти производится при закрытии набора данных. Так, параметр SPACE=(TRK,(40,,8),RLSE) указывает, что запрашивается 40 дорожек без приращения. Для оглавления выделяется восемь блоков. Незанятая память после закрытия набора данных освобождается.

    Параметр LABEL чаще всего используется для описания набора данных на магнитной ленте. В нем могут быть указаны порядковый номер набора данных на МЛ, тип метки, срок хранения набора данных, пароль. Наиболее употребительный формат параметра:

    LABEL=([номер][,формат][PASSWORD][,IN|,OUT])

    Подпараметр номер задает последовательный номер набора данных на ленточном томе. Значения 0 или 1 указывают на первый по порядку набор данных. Для каталогизированных наборов данных, а также наборов данных, передаваемых из предыдущего шага задания (DISP=,PASS), номер можно не указывать.

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

    SL - стандартный формат IBM (используется по умолчанию, можно не указывать);

    SUL - указывает, где набор данных имеет стандартные метки и метки пользователя;

    AL - используется формат ISO/ANSI;

    NSL - набор данных имеет нестандартные метки;

    NL - набор данных не имеет меток;

    BLP - необходимо обойти обработку метки набора данных.

    Подпараметр, задаваемый ключевым словом PASSWORD, требует при изменении набора данных, чтобы пользователь ввел правильный пароль, используя консоль или терминал TSO.

    Ключевые слова IN и OUT указывают, что набор данных обрабатывается для ввода или вывода соответственно.

    В приводимом ниже примере открывается для чтения 5-й набор данных, имеющий нестандартные метки, на ленточном томе TAPE01:

    //DD1 DD DSNAME=NAB1,UNIT=TAPE01,
    // VOL=SER=MT1,LABEL=(5,NSL,,IN)

    Параметр SYSOUT идентифицирует набор данных как системный выходной набор данных. Наиболее употребительная форма для записи параметра:

    SYSOUT=(выходной_класс[,имя_прог])

    Чаще всего подпараметр выходной_класс определяет имя выходного класса для описываемого набора данных в виде символа А-Z или 0-9. Атрибуты выходных классов определяются при настройке JES. Если в качестве значения выходного класса указана звездочка (*), это означает, что следует использовать то же значение, что у параметра MSGCLASS, определенное в операторе ,) в позиции данного подпараметра задает так называемый "пустой" класс, означающий, что основные атрибуты вывода будут определены в операторе задания OUTPUT, ссылка на который должна быть указана далее с помощью параметра OUTPUT.

    Подпараметр имя_прог позволяет указать имя программы (загрузочного модуля), обрабатывающей выходной набор данных. Если подпараметр не указан, JES будет обрабатывать выходной набор данных стандартным способом, определенным для соответствующего класса.

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

    Примеры использования параметра SYSOUT:

  • определение выходного класса B:
    //SYSPRINT DD SYSOUT=B
  • определение выходного класса по значению MSGCLASS:
    //YSl JOB  ,,MSGCLASS=A
    //ST1 EXEC PGM=ZARPLATA
    //DD1 DD   SYSOUT=*
  • определение пустого выходного класса и ссылки на оператор OUTPUT:
    //OUT1 OUTPUT BURST=Y,CHARS=(GT12),COPIES=3
    ...
    //DS DD SYSOUT=(,),OUTPUT=*.OUT1
  • обработка выходного набора данных программой ввода заданий INTRDR:
    //SYSUT2 DD SYSOUT=(X,INTRDR)
  • Итак, мы рассмотрели небольшую часть из общего числа параметров оператора DD, однако наиболее важную с точки зрения практического использования. Рассмотрим ряд примеров описания наборов данных при решении некоторых типовых задач .

  • Описание каталогизированных наборов данных на DASD. В этом случае достаточно указать только параметры DSN и DISP, поскольку остальную необходимую информацию о размещении набора данных система получит из каталога, например:
    //CATDS1     DD    DSN=AS30.MY.DSET,DISP=OLD
    //CATDS2     DD    DSN=LIB.DATA(CHAR),DISP=SHR
  • Описание некаталогизированных наборов данных на DASD. Здесь требуется указывать дополнительно значения параметров UNIT и VOLUME, например:
    //NOCATDS    DD    DSNAME=AS30.MY.DSET,DISP=OLD,
    //        VOL=SER=D01457,UNIT=3390
  • Описание нового non-SMS набора данных на жестких магнитных дисках. Требуется задавать параметры DCB и SPACE. В приводимом ниже примере создается библиотечный набор данных со 120-байтными записями фиксированной длины на выделенном пространстве внешней памяти размером 10 цилиндров с приращением в три цилиндра. На оглавление отводится два блока по 256 байт, при завершении шага задания неиспользуемая память будет освобождена, а набор данных сохранен.
    //NEWDS   DD    DSNAME=D.AS32.DATA,DISP=(NEW,KEEP),
    //        VOL=SER=BIBLIO,UNIT=3380,
    //        DCB=(RECFM=F,LRECL=120),
    //        SPACE=(CYL,(10,3,2),RLSE)
  • Процедуры JCL

    В языке управления заданиями, как и в других языках программирования, могут быть определены процедуры. Мы уже не раз упоминали этот важнейший элемент JCL при рассмотрении различных функций z/OS.

    Процедура представляет собой последовательность предложений (операторов) JCL, оформленных как автономная JCL-программа. Процедура может храниться в системной или пользовательской библиотеке процедур либо непосредственно описываться в задании. Процедуры JCL, как и процедуры языков программирования, предназначены для решения типовых пользовательских задач на основе принципа: "один раз записал и сохранил, много раз использую". Такой подход существенно упрощает процесс составления заданий.

    При обращении к процедуре входящие в ее состав операторы JCL вставляются в задание вместо вызывающего оператора EXEC. При этом могут быть изменены значения параметров операторов процедуры, целые операторы, а также добавлены новые операторы.

    В JCL поддерживается два вида процедур: каталогизированные процедуры и процедуры во входном потоке. Каталогизированные процедуры размещаются в специальных наборах данных - библиотеках процедур. JES2 располагает настраиваемым списком используемых стандартных библиотек. Пользователь также имеет возможность указать собственный набор библиотек процедур с помощью оператора JCLLIB (о нем речь пойдет ниже). Процедуры во входном потоке описываются непосредственно в задании после оператора JOB.

    Процедура начинается оператором процедуры PROC и заканчивается оператором конца процедуры PEND. Имя оператора процедуры является именем процедуры при размещении ее во входном потоке. В операторе PROC могут быть описаны параметры процедуры. Процедуры могут содержать различные операторы JCL, включая EXEC, DD, OUTPUT, IF/THEN/ELSE, INCLUDE, CNTL, ENDCNTL, SET, а также вызовы других процедур. Процедуры не должны содержать операторы DD * и DD DATA, оператор //JOBLIB DD, операторы JES и описания других процедур (операторы PROC и PEND ).

    Каждый оператор EXEC вместе с принадлежащими ему операторами DD называется шагом (пунктом) процедуры. Имя оператора EXEC является именем шага процедуры. В общем виде процедура имеет следующую структуру:

    //имя PROC параметры
    // EXEC
    // DD
    ...
    // EXEC
    // DD
    ...
    // PEND

    В теле процедуры могут быть записаны так называемые символические или формальные параметры, которые при вызове процедуры могут быть заменены на заданные пользователем значения ( фактические параметры ). Формальные параметры представляются в виде имя, и могут быть указаны в процедуре в качестве параметра, подпараметра или значения в любом операторе. Фактические значения для символических параметров устанавливаются в вызывающем процедуру операторе EXEC, в виде списка, каждый элемент которого выглядит так:

    имя=фактическое_значение

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

    //MYPROC  PROC  UNT=SYSDA,PRN=A,TOM=DISK8,P=P2,NAME=DS.OPT
    //ST1     EXEC  PGM=SUV,REGION=50K
    //LIB     DD    DSN=SYSLIB,DISP=OLD
    //SYSIN   DD    DSN=NAME,DISP=(NEW,KEEP),
    //              VOL=SER=TOM,UNIT=UNT,
    //              SPACE=(TRK,(10,1,10))
    //SYSOUT  DD    SYSOUT=PRN
    //ST2     EXEC  PGM=CALC,PARM=(P1,P,P3)
    //TABL    DD    DSN=TABL.DATA,DISP=SHR
    //              VOL=SER=WORK1,UNIT=DISK
    //        PEND

    Данная процедура с именем MYPROC содержит два шага ( ST1 и ST2 ). В теле процедуры выделено пять формальных параметров. В операторе PROC представлен список фактических стандартных значений формальных параметров, которые будут использоваться по умолчанию в случае, если пользователь не определит собственные фактические значения. Например, если процедура будет вызвана в задании следующим образом:

    //PRIM1 EXEC    MYPROC

    то это как раз такой случай: все значения формальных параметров будут выбраны из оператора PROC.

    Если же пользователь захочет изменить все или некоторые стандартные значения, их необходимо указать непосредственно в операторе EXEC:

    //PRIM2 EXEC MYPROC,NAME=BIBL,UNT=3390

    В данном случае устанавливаются новые значения для формальных параметров NAME и UNT, а остальные параметры примут стандартные значения, записанные в операторе PROC. При изменении значений параметров пользователь обязан следить, чтобы модифицированная таким образом процедура была корректной как синтаксически, так и семантически. Очевидно, что значения символических параметров, назначенных пользователем в операторе EXEC, действуют только в текущем шаге задания. На другие шаги задания их действие не распространяется, и там могут быть установлены другие значения.

    Наряду с использованием символических параметров, существует возможность модифицировать целиком или частично операторы процедуры EXEC и DD. Например, модификация параметров операторов EXEC может производиться следующим образом:

    //PRIM3 EXEC MYPROC,REGION.ST1=100K,COND.ST2=(8,LE,ST1)

    Здесь пользователь требует изменить значение параметра REGION, используемого в шаге процедуры ST1, и добавить параметр COND к оператору шага ST2. Синтаксис записи модифицируемых параметров вполне очевиден.

    Модификация параметров операторов DD осуществляется несколько иначе. Например, при необходимости изменить имя и диспозицию набора данных, описанного в операторе DD с именем LIB шага ST1, и отказаться от определения параметров в VOL и UNIT операторе DD с именем TABL шага ST2, при вызове процедуры следует записать:

    //PRIM4 EXEC MYPROC,NAME=XXXXX.YY,P=P5
    //ST1.LIB     DD DSN=USERLIB,DISP=SHR
    //ST2.TABL DD DSN=TABL1.DATA,VOL=,UNIT=

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

    Точно таким же образом может производиться добавление в процедуру новых операторов DD:

    //PRIM5 EXEC MYPROC,PRN=*
    //ST2.SYSPRINT DD SYSOUT=A

    Здесь к шагу ST2 процедуры будет добавлен оператор DD с именем SYSPRINT. Таким способом можно обойти ограничение на использование в теле процедур операторов DD * и DD DATA.

    Значительную роль в работе пользователей z/OS играют имеющиеся в системе каталогизированные процедуры. Как уже отмечалось, обычно существует несколько стандартных библиотек процедур (самая известная среди них - SYS1.PROCLIB ), определяемых системным программистом в настройках подсистемы JES2. Библиотеки содержат множество готовых процедур, предназначенных для решения типовых задач пользователей и администраторов, включая процедуры поддержки разработки приложений (компиляция, редактирование связей и выполнение программ), процедуры запуска и настройки системных компонентов, процедуры управления данными и т.п.

    Для вызова таких процедур в задании необходимо указать имя каталогизированной процедуры и при необходимости фактические параметры, а также модифицирующие операторы. Важно подчеркнуть, что в качестве имени каталогизированной процедуры используется имя раздела библиотеки процедур, а не имя оператора PROC! Отметим также, что каталогизированные процедуры могут вызываться по команде оператора START, при этом порождаются запускаемые процедуры (STC-задания), о которых упоминалось ранее. Примеры применения некоторых каталогизированных процедур при разработке приложений будут рассмотрены в п. 5.1.8.

    Помимо системных библиотек процедур, доступных пользователям по умолчанию, существует возможность создания и использования личных библиотек процедур. В этом случае потребуется сообщить системе имена таких библиотек с помощью оператора JCLLIB. Данный оператор имеет единственный параметр ORDER, с помощью которого можно задать список личных библиотек, используемых в задании:

    ORDER=(библиотека1[,библиотека2]...)

    В приведенном ниже примере определен список из двух библиотек ( USER1.PROCLIB,USER1.WORKLIB ), которые система будет использовать для поиска процедуры SMETA в первую очередь. Если поиск завершится неудачей, будут просматриваться системные библиотеки:

    //USER1 J0B ...
    //USERLIB JCLLIB ORDER=(USER1.PROCLIB,USER1.WORKLIB)
    // EXEC PROC=SMETA

    Структура отчета о выполнении задания

    Как отмечалось ранее, все сообщения и результаты работы программ, выполняемых в рамках задания, группируются JES2 в наборе данных SYSOUT. На основе этих данных формируется отчет о выполненном задании. У пользователя есть несколько способов получить и вывести отчет, используя средства TSO/E, ISPF/PDF или SDSF. На рис. 5.22 представлен общий вид отчета (листинга) о выполнении задания.

    (рис 5.22) Пример отчета о выполненном задании

    Стандартный листинг состоит из нескольких информационных блоков:

  • Общая информация, определяемая при инсталляции системы.
  • Статистическая информация, формируемая подсистемой управления заданиями JES.
  • Текст задания на языке JCL, если заданы соответствующие значения параметра MSGLEVEL и сообщения о синтаксических ошибках.
  • Системные сообщения о ходе и результатах выполнения задания.
  • Основным признаком правильности выполнения задания является значение кода завершения (Condition code), отображаемое в блоке 4 листинга в виде:

    СOND CODE = XXXX

    Если код завершения равен 0000, то задание выполнено успешно. Ненулевое значение кода означает, что задание завершилось аварийно (состояние ABEND ). Каждому значению кода завершения соответствует определенная причина, а в отчете содержатся поясняющие диагностические сообщения.

    Вернуться к учебному плану