Основы JCL для начинающих

Этот курс предназначен для знакомства с языком управления заданиями (JCL), используемым в операционных системах мейнфреймов IBM. Вы изучите базовый синтаксис, ключевые операторы и научитесь писать скрипты для запуска пакетных заданий.

1. Введение в JCL и архитектуру мейнфреймов

Введение в JCL и архитектуру мейнфреймов

Добро пожаловать в курс «Основы JCL для начинающих». Если вы читаете эти строки, значит, вы решили прикоснуться к одной из самых надежных, мощных и, не побоюсь этого слова, легендарных технологий в мире IT — мейнфреймам.

Многие новички ошибочно полагают, что мейнфреймы — это пыльные шкафы из 70-х годов, которые давно пора списать. Однако реальность такова: если вы сегодня расплачивались картой, бронировали билет на самолет или проверяли баланс в банковском приложении, с вероятностью 99% ваша транзакция была обработана именно мейнфреймом.

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

Что такое мейнфрейм?

Мейнфрейм (Mainframe) — это высокопроизводительный сервер, предназначенный для обработки огромных объемов данных и проведения миллиардов транзакций в день с высочайшей надежностью.

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

!Современный мейнфрейм IBM z16, демонстрирующий, что это современное и мощное оборудование.

Ключевые характеристики мейнфреймов

  • Надежность (Reliability): Мейнфреймы славятся своим аптаймом (временем непрерывной работы). Они могут работать десятилетиями без перезагрузки. Многие компоненты (процессоры, память, блоки питания) можно заменять «на горячую», не выключая машину.
  • Масштабируемость (Scalability): Если бизнесу нужно больше мощности, мейнфрейм позволяет добавить ресурсы практически мгновенно.
  • Безопасность (Security): Архитектура мейнфреймов изначально строилась с упором на защиту данных и разграничение доступа.
  • Операционная система z/OS

    Железо — это только половина успеха. Чтобы управлять такой мощью, нужна специальная операционная система. Самой распространенной ОС для мейнфреймов IBM является z/OS.

    z/OS — это сложная, многопользовательская и многозадачная система. Она управляет памятью, процессорами и, что самое важное для нас, заданиями (Jobs).

    Пакетная обработка vs Интерактивная обработка

    Чтобы понять суть JCL, нужно разобраться в двух режимах работы компьютера:

    * Интерактивная обработка (Online Processing): Это то, к чему мы привыкли. Вы нажимаете кнопку — получаете результат. Пример: кассир в банке вводит ваши данные, и система мгновенно выдает информацию о счете. Здесь важна скорость реакции. * Пакетная обработка (Batch Processing): Это выполнение задач без участия человека. Пример: ночью банк должен начислить проценты по вкладам для миллионов клиентов. Системе не нужно отвечать мгновенно, ей нужно обработать огромный массив данных к утру.

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

    Что такое JCL?

    JCL (Job Control Language) — это язык управления заданиями. Это скриптовый язык, который используется в операционных системах мейнфреймов IBM (таких как z/OS) для инструктажа системы о том, как выполнять пакетное задание (Job).

    Важно понимать: JCL — это не язык программирования в привычном смысле (как Java, Python или COBOL). На JCL вы не пишете логику программы (сложение чисел, циклы, условия бизнес-логики). На JCL вы пишете инструкции по запуску программ.

    > JCL — это клей, который соединяет вашу программу, операционную систему и данные.

    Аналогия с рестораном

    Давайте представим, что мейнфрейм — это огромная кухня ресторана, а операционная система z/OS — это шеф-повар.

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

    В этом бланке вы указываете:

  • Кто платит за банкет? (Имя задания, учетная запись).
  • Что готовить? (Какую программу запустить — например, программу на COBOL для расчета зарплаты).
  • Из каких продуктов? (Где лежат входные данные — файлы, базы данных).
  • Куда подать блюдо? (Куда записать результат — в файл, на принтер, на ленту).
  • Если вы заполните бланк (JCL) неправильно, шеф-повар (z/OS) вернет его вам с ошибкой, и ничего готовиться не будет.

    !Схема взаимодействия пользователя, JCL и операционной системы.

    Базовая структура JCL

    JCL славится своим строгим синтаксисом. Почти каждая строка в JCL начинается с двух косых черт: //. Это сигнал системе, что дальше идет команда JCL.

    Любое задание (Job) состоит из трех основных типов утверждений (statements). Запомните эту «святую троицу» JCL:

  • JOB (Задание)
  • EXEC (Выполнение)
  • DD (Определение данных)
  • Рассмотрим их подробнее.

    1. JOB Statement (Карта задания)

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

    Пример:

    2. EXEC Statement (Карта выполнения)

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

    В одном задании (JOB) может быть несколько шагов (Steps), то есть несколько карт EXEC. Например, первый шаг компилирует программу, второй — запускает её.

    Пример:

    Здесь мы просим запустить программу с именем CALCPROG.

    3. DD Statement (Data Definition — Определение данных)

    Это самые частые и сложные строки в JCL. Программе CALCPROG нужны данные для работы. Она не знает, где физически на диске лежат файлы. Она просто знает, что ей нужно читать из «ВХОДА» и писать в «ВЫХОД».

    Карта DD связывает логическое имя файла внутри программы с физическим файлом на устройстве хранения.

    Пример:

    Здесь мы говорим, что когда программа ищет INPUT, нужно дать ей файл BANK.ACCOUNTS.DATA. А всё, что программа пишет в OUTPUT, нужно отправить на принтер (SYSOUT).

    Почему JCL так важен?

    Может показаться, что JCL — это архаизм. Зачем писать код, чтобы просто запустить программу? В Windows мы просто кликаем по иконке.

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

    * Автоматизировать процессы: Задания запускаются планировщиками ночью, без участия людей. * Управлять ресурсами: Вы можете указать, сколько памяти нужно заданию, чтобы не «уложить» сервер. * Обрабатывать ошибки: В JCL можно прописать условия: «Если первый шаг прошел успешно, запускай второй. Если нет — запускай процедуру аварийного восстановления». * Абстрагироваться от железа: Программисту на COBOL не нужно знать, на каком конкретно диске лежат данные. Это решает JCL.

    Резюме

    Подведем итоги первой статьи:

  • Мейнфреймы — это мощные серверы для пакетной обработки данных и критически важных транзакций.
  • z/OS — основная операционная система для мейнфреймов IBM.
  • JCL — это язык, на котором мы описываем задания для ОС. Он говорит системе: кто запускает, что запускает и с какими данными.
  • Три кита JCL: JOB (идентификация), EXEC (программа), DD (данные).
  • В следующей статье мы подробно разберем синтаксис карты JOB и научимся запускать наше первое простейшее задание в системе.

    2. Основы синтаксиса и структура JOB-карты

    Основы синтаксиса и структура JOB-карты

    Приветствую вас на второй лекции курса «Основы JCL для начинающих». В прошлой статье мы познакомились с концепцией мейнфреймов и выяснили, что JCL — это язык, с помощью которого мы общаемся с операционной системой z/OS. Мы также узнали о «святой троице» операторов: JOB, EXEC и DD.

    Сегодня мы переходим от теории к практике. Мы детально разберем фундамент любого задания — карту JOB. Если представить, что ваше задание — это пассажир, который хочет улететь на самолете (мейнфрейме), то карта JOB — это его паспорт и посадочный талон одновременно. Без неё система просто не пустит вас на борт.

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

    Железные правила синтаксиса JCL

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

    !Иллюстрация связи формата JCL с историческими перфокартами.

    Структура строки

    Каждая строка JCL кода условно делится на 5 полей. Нарушение границ этих полей приведет к ошибке JCL ERROR еще до того, как ваша программа начнет выполняться.

  • Поле идентификатора (Identifier Field): Колонки 1 и 2.
  • * Почти всегда содержит две косые черты: //. Исключение: разделитель данных / (используется редко) и комментарии.
  • Поле имени (Name Field): Начинается с колонки 3.
  • * Здесь мы даем имя нашему заданию, шагу или файлу. * Имя должно начинаться сразу после // без пробелов.
  • Поле операции (Operation Field):
  • * Идет после поля имени. * Отделяется от имени минимум одним пробелом. * Содержит команду: JOB, EXEC или DD.
  • Поле операндов (Operand Field):
  • * Идет после поля операции. * Отделяется минимум одним пробелом. * Здесь пишутся параметры (ключевые слова, значения).
  • Поле комментариев (Comments Field):
  • * Идет после операндов. * Отделяется минимум одним пробелом.

    > Важно: Весь значащий код должен уместиться в колонках с 1 по 71. Колонка 72 зарезервирована для знака продолжения строки (хотя в современном JCL это используется редко), а колонки 73-80 игнорируются системой (раньше там ставили нумерацию карт, чтобы не перепутать их, если колода упадет на пол).

    Пример разметки

    Разберем по колонкам: * // (Колонки 1-2) — Идентификатор. * MYJOB01 (Колонки 3-9) — Имя. * Пробелы (Колонка 10+) — Разделитель. * JOB — Операция. * Пробелы — Разделитель. * (123),'TEST',CLASS=A — Операнды. * Пробелы — Разделитель. * ЭТО КОММЕНТАРИЙ — Комментарий.

    Оператор JOB: Ваш пропуск в систему

    Оператор JOB выполняет четыре критические функции:

  • Идентификация: Дает заданию уникальное имя.
  • Валидация: Проверяет право пользователя на запуск (логин/пароль, если требуется).
  • Учет (Accounting): Указывает, с какого счета списывать деньги за использование процессорного времени.
  • Параметры среды: Задает глобальные настройки (приоритет, лимиты памяти, куда слать отчеты).
  • Синтаксис выглядит так:

    1. Имя задания (Jobname)

    Имя задания — это то, как вы будете искать свой процесс в системе. К нему предъявляются строгие требования: * Длина: от 1 до 8 символов. * Первый символ: Буква (A-Z) или национальные символы (#, @, `Верно. * //1MYJOBОшибка (начинается с цифры). * //MY_JOBОшибка (недопустимый символ _). * //VERYLONGNAMEОшибка (больше 8 символов).

    2. Позиционные параметры (Positional Parameters)

    Сразу после оператора JOB идут два параметра, порядок которых важен. Если вы их меняете местами, смысл меняется.

    #### А. Учетная информация (Accounting Information) Это первый параметр. Обычно это номер счета или код отдела. В учебных системах здесь часто ставят просто 1 или фиктивный номер.

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

    Пример:

    3. Ключевые параметры (Keyword Parameters)

    После позиционных параметров следуют ключевые. Их можно писать в любом порядке. Синтаксис: КЛЮЧЕВОЕ_СЛОВО=ЗНАЧЕНИЕ`. Их много, но мы разберем самые важные для новичка.

    [VISUALIZATION: Диаграмма в виде швейцарского ножа. Рукоятка подписана

    3. Оператор EXEC: запуск программ и системных утилит

    Оператор EXEC: запуск программ и системных утилит

    Рад приветствовать вас на третьем уроке курса «Основы JCL для начинающих». В предыдущих статьях мы разобрались с тем, что такое мейнфрейм, и научились заполнять «паспорт» нашего задания — карту JOB.

    Теперь, когда система знает, кто мы и кто платит за вычислительные ресурсы, пришло время объяснить ей, что именно мы хотим сделать. Мы переходим к «сердцу» любого задания — оператору EXEC.

    Если карта JOB — это заголовок документа, то карты EXEC — это пункты плана действий. Именно здесь происходит магия: запускаются программы, сортируются данные и выполняются утилиты.

    Что такое оператор EXEC?

    EXEC (от слова Execute — выполнять) — это команда, которая указывает операционной системе z/OS запустить определенную программу или процедуру.

    Одно задание (Job) может состоять из одного или множества шагов (Steps). Каждый шаг начинается с оператора EXEC. Это позволяет строить сложные цепочки обработки данных: например, на первом шаге мы скачиваем данные, на втором — сортируем их, на третьем — печатаем отчет.

    !Визуализация многошагового задания (Multi-step Job), где каждый шаг инициируется оператором EXEC.

    Базовый синтаксис

    Формат оператора EXEC следует стандартным правилам JCL, которые мы изучили ранее:

  • ИМЯ_ШАГА (Stepname): Уникальное имя шага внутри задания. Оно нужно, чтобы мы могли ссылаться на этот шаг позже (например, «запусти шаг 3 только если шаг 1 прошел успешно»). Правила именования те же, что и для JOB (до 8 символов, начинается с буквы).
  • EXEC: Ключевое слово операции.
  • ПАРАМЕТРЫ: Здесь мы указываем, что запускать и как.
  • Два способа использования EXEC

    Существует два основных варианта того, что можно написать в поле параметров. Вы можете запустить либо программу (PGM), либо процедуру (PROC).

    1. Запуск программы (PGM)

    Это самый прямой способ. Вы говорите системе: «Возьми вот этот исполняемый файл и запусти его».

    Синтаксис:

    Здесь PROGRAM1 — это имя загрузочного модуля (аналог .exe файла в Windows), который лежит в одной из системных или пользовательских библиотек.

    Программы могут быть: * Пользовательские: Написанные вами или вашими коллегами на COBOL, PL/I, Assembler и скомпилированные ранее. * Системные утилиты: Готовые инструменты от IBM для работы с файлами (копирование, удаление, сортировка).

    2. Запуск процедуры (PROC)

    Часто в компаниях используются стандартные наборы действий. Чтобы не переписывать 100 строк JCL кода каждый раз, их сохраняют в Процедуру (Cataloged Procedure).

    Синтаксис:

    или явно:

    Когда z/OS видит такой вызов, она находит сохраненный кусок JCL-кода с именем MYPROC и подставляет его в ваше задание. Для новичка важно понимать разницу: PGM запускает код, PROC запускает другой JCL, который внутри себя запускает PGM.

    Системные утилиты: швейцарский нож мейнфреймщика

    В мире JCL вам не всегда нужно писать свои программы. Для 80% рутинных задач (копирование файлов, сортировка, создание пустых файлов) используются стандартные утилиты IBM. Знать их названия — обязанность каждого специалиста.

    Рассмотрим две самые легендарные утилиты.

    IEFBR14 — Программа, которая ничего не делает

    Это не шутка. Утилита IEFBR14 — это программа, которая запускается, сразу же возвращает код успешного завершения (0) и выключается. Она содержит всего одну инструкцию процессора: «Вернуться».

    Зачем она нужна? В JCL создание и удаление файлов происходит до запуска программы (на этапе аллокации) или после (на этапе завершения). Чтобы просто создать пустой файл или удалить старый, нам нужен «формальный» повод запустить шаг. Этим поводом и служит IEFBR14.

    Пример использования (удаление и создание файла):

    IEBGENER — Копировальный аппарат

    Утилита IEBGENER используется для копирования данных из одного места в другое. Например, скопировать файл с диска на ленту, или распечатать содержимое файла на принтер.

    Пример:

    Ключевые параметры EXEC

    Помимо указания имени программы, оператор EXEC позволяет настраивать условия выполнения. Рассмотрим самые важные параметры.

    1. PARM (Передача данных)

    Параметр PARM позволяет передать небольшую строку данных прямо в программу при запуске. Это аналог аргументов командной строки (как java MyProgram -argument в Windows/Linux).

    Пример:

    Программа MYPROG при старте сможет прочитать строку NEWYEAR2024 и использовать её, например, как дату для отчета.

    > Ограничение: Длина строки в PARM не может превышать 100 символов.

    2. TIME (Лимит времени)

    Мейнфреймы продают процессорное время за деньги. Чтобы ваша программа из-за ошибки не ушла в «бесконечный цикл» и не потратила весь бюджет компании, используется параметр TIME.

    Пример:

    Это означает: «Если программа работает дольше 1 минуты и 30 секунд процессорного времени, принудительно убей её».

    3. REGION (Лимит памяти)

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

    Пример:

    Здесь мы запрашиваем 4 мегабайта памяти. Если программе понадобится больше, она аварийно завершится с ошибкой (ABEND).

    4. COND (Условия выполнения)

    Это один из самых мощных и сложных параметров. Он позволяет управлять потоком выполнения задания. В JCL каждая программа после завершения возвращает Код возврата (Return Code или RC).

    Стандартные значения RC: * 00: Все прошло успешно. * 04: Предупреждение (Warning). Что-то не идеально, но работать можно. * 08: Ошибка (Error). Часть задания не выполнена. * 12: Серьезная ошибка (Severe Error). Результаты недостоверны. * 16: Фатальная ошибка (Terminal Error). Программа упала.

    С помощью параметра COND вы можете сказать: «Запускай этот шаг, ТОЛЬКО если предыдущий завершился успешно (RC=0)».

    Пример логики (упрощенно):

    Примечание: Синтаксис COND в JCL часто сбивает с толку новичков, так как он работает по принципу «Пропусти этот шаг, если условие ИСТИННО». Мы разберем детальную логику COND в отдельной статье про управление потоком, так как это тема требует глубокого погружения.

    Резюме

    Подведем итоги урока:

  • Оператор EXEC отвечает за запуск программ (PGM=) или процедур (PROC=).
  • Задание может состоять из множества шагов (Steps), выполняющихся последовательно.
  • IEFBR14 — полезная утилита-пустышка для операций с файлами.
  • Параметр PARM передает данные внутрь программы.
  • Параметры TIME и REGION ограничивают ресурсы, чтобы программа не «съела» весь мейнфрейм.
  • Программы общаются с системой через Коды возврата (RC), где 0 означает полный успех.
  • Теперь мы умеем представляться системе (JOB) и говорить ей, что делать (EXEC). Но нам не хватает последнего элемента: с чем работать? Откуда брать данные и куда их класть? В следующей статье мы разберем самый объемный и важный оператор JCL — DD (Data Definition).

    4. Оператор DD: определение данных и управление файлами

    Оператор DD: определение данных и управление файлами

    Добро пожаловать на четвертый урок курса «Основы JCL для начинающих». Мы уже проделали большой путь: научились идентифицировать себя в системе с помощью JOB и запускать программы с помощью EXEC. Казалось бы, что еще нужно?

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

    Сегодня мы изучим самый сложный, но и самый важный оператор в JCL — DD (Data Definition). Именно он отвечает за файлы, принтеры и управление хранением данных.

    Что такое DD и зачем он нужен?

    DD (Data Definition) — это оператор, который связывает логическое имя файла внутри программы с физическим устройством или набором данных (Dataset) на диске.

    Это ключевая концепция мейнфреймов, которую сложно понять пользователям ПК. В Windows, когда вы пишете программу на Python, вы часто пишете прямо в коде: open('C:\Users\Data.txt'). В мире мейнфреймов это считается дурным тоном (хардкодинг).

    Вместо этого программист в коде пишет: «Я хочу читать из файла с именем INPUT». А какой именно физический файл будет подставлен под имя INPUT (вчерашний отчет, сегодняшняя база или тестовые данные) — решаете вы в JCL в момент запуска.

    !Иллюстрация того, как JCL выступает мостом между кодом программы и физическим диском.

    Синтаксис оператора DD

    Формат следует стандартным правилам JCL:

  • DDNAME (Data Definition Name): Имя, которое ищет программа. Оно должно состоять из 1–8 символов. Если программа написана так, что ищет файл MYDATA, вы обязаны назвать DD-карту //MYDATA.
  • DD: Оператор.
  • ПАРАМЕТРЫ: Описание физического ресурса (имя файла, статус, размер).
  • Рассмотрим главные параметры, без которых не обходится ни одно задание.

    Параметр DSN: Имя набора данных

    DSN (или DSNAME) — это имя файла на диске. В терминологии мейнфреймов файлы называются Наборами данных (Datasets).

    Имена файлов на мейнфреймах не похожи на document.docx. Они имеют иерархическую структуру, разделенную точками, и могут быть длиной до 44 символов.

    Пример:

    Структура имени: * HLQ (High Level Qualifier): Первое слово (BANK). Обычно указывает на владельца или проект. * Сегменты: Уточняют содержание (DEPT01, YEAR2024). * LLQ (Low Level Qualifier): Последнее слово (DATA). Часто указывает на тип данных (как расширение в Windows).

    Параметр DISP: Статус файла (Disposition)

    Это самый важный параметр. Если вы ошибетесь в DISP, вы можете случайно удалить важную базу данных или не сохранить результаты многочасовых вычислений.

    DISP сообщает системе три вещи:

  • В каком состоянии файл находится сейчас (до запуска шага)?
  • Что делать с файлом, если шаг завершится успешно?
  • Что делать с файлом, если шаг завершится с ошибкой (Abend)?
  • Синтаксис:

    1. STATUS (Начальное состояние)

    * NEW: Файла не существует, его нужно создать. Система выделит под него место. * OLD: Файл существует. Мы требуем эксклюзивный доступ. Пока наша программа работает, никто другой (ни человек, ни программа) не сможет прочитать или записать в этот файл. Используется, когда мы хотим перезаписать данные. * SHR (Share): Файл существует. Мы готовы делить его с другими. Другие пользователи могут читать его одновременно с нами. Это самый частый режим для чтения данных. * MOD: Если файл есть — дописать в конец. Если нет — создать новый.

    2. NORMAL-END (Нормальное завершение)

    Что делать, когда программа отработала без ошибок (RC=0)?

    * CATLG (Catalog): Сохранить файл и записать информацию о нем в системный каталог. В будущем мы сможем найти его просто по имени. Это стандарт для сохранения результатов. * DELETE: Удалить файл и освободить место на диске. Используется для временных файлов. * KEEP: Сохранить файл на диске, но не обновлять каталог (используется редко, в основном для лент). * PASS: Передать файл следующему шагу в этом же задании (не сохраняя на диск окончательно).

    3. ABNORMAL-END (Аварийное завершение)

    Что делать, если программа «упала»?

    * DELETE: Если мы создавали новый файл (NEW), но программа сломалась на середине, этот «обрубок» нам не нужен. Удаляем его. * CATLG/KEEP: Если файл очень ценный, и мы хотим попытаться восстановить данные вручную.

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

    Сценарий А: Создание нового отчета

    Перевод: Создай новый файл. Если все хорошо — сохрани его в каталог. Если ошибка — удали мусор.

    Сценарий Б: Чтение справочника клиентов

    Перевод: Файл уже есть. Я только читаю. Пусть другие тоже читают, я не жадный. (Второй и третий параметры по умолчанию для SHR — это KEEP, KEEP).

    Сценарий В: Очистка файла перед записью

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

    Параметр SPACE: Выделение места

    Когда вы создаете файл (DISP=NEW), вы должны сказать системе, сколько места зарезервировать. На мейнфреймах место измеряется не в мегабайтах, а в Треках (Tracks) и Цилиндрах (Cylinders) — это геометрия жесткого диска.

    Синтаксис:

    * UNIT: Единица измерения (TRK или CYL). Цилиндр намного больше трека. * PRIMARY: Сколько выделить сразу при создании. * SECONDARY: Сколько добавлять, если первичное место закончится. Система может добавлять этот объем до 15 раз (экстенты). * RLSE (Release): Если мы запросили 100 цилиндров, а использовали только 5, вернуть остальные 95 системе после окончания шага.

    Пример:

    Дай мне 10 цилиндров. Если не хватит, добавляй по 5. Если останется лишнее — забери обратно.

    Параметры DCB: Формат данных

    DCB (Data Control Block) описывает физическую структуру записи внутри файла. Самые важные подпараметры:

  • LRECL (Logical Record Length): Длина одной строки в байтах. Например, 80 символов.
  • RECFM (Record Format):
  • * FB (Fixed Block): Все строки имеют одинаковую длину. Самый удобный формат. * VB (Variable Block): Строки разной длины (экономит место, но сложнее в обработке).
  • BLKSIZE: Размер блока данных, который считывается с диска за один раз. Обычно система рассчитывает это сама (System Determined Blocksize), поэтому сейчас этот параметр часто опускают.
  • Пример:

    Специальные DD-имена

    Существует несколько зарезервированных имен и назначений, которые работают особым образом.

    1. SYSOUT (System Output)

    Куда девать текст, который программа просто «печатает» (логи, сообщения об ошибках)? На мейнфреймах нет монитора, подключенного к заданию. Весь вывод направляется в SPOOL — временное хранилище вывода.

    Звездочка * означает: «Отправь вывод в тот же класс вывода, что и лог самого задания (MSGCLASS)». Это стандартная строка для вывода отчетов.

    2. SYSIN (System Input)

    Иногда данные для программы настолько малы (например, пара управляющих команд), что нет смысла создавать для них отдельный файл на диске. Их можно написать прямо внутри JCL кода. Это называется Instream Data.

    Все, что находится между DD и разделителем /, будет передано программе как входной файл.

    3. DUMMY

    Это аналог /dev/null в Linux. Если программа требует файл (например, для вывода ошибок), но вам этот вывод не нужен, вы можете направить его в «пустоту».

    Программа будет думать, что пишет в файл, но данные будут исчезать.

    Собираем все вместе

    Давайте посмотрим на полноценный шаг задания, который создает новый файл для программы PROG01.

    Разбор полетов:

  • Запускаем PROG01.
  • На вход (INPUT) даем существующий файл BANK.OLD.DATA в режиме общего доступа (SHR).
  • На выход (OUTPUT) создаем новый файл BANK.NEW.DATA.
  • * Если успех — каталогизируем, если сбой — удаляем. * Выделяем 50 цилиндров на диске типа SYSDA. * Записи будут фиксированной длины 100 байт.
  • Все текстовые сообщения программы (SYSOUT, SYSPRINT) отправляем в спул для просмотра программистом.
  • Резюме

    Оператор DD — это ваш инструмент управления материальным миром мейнфрейма.

  • DDNAME связывает код программы с JCL.
  • DSN указывает на физический файл.
  • DISP управляет жизнью и смертью файла (создать, удалить, сохранить).
  • SPACE выделяет место на диске.
  • SYSOUT используется для вывода логов и отчетов.
  • Теперь вы знаете все три компонента JCL: JOB (паспорт), EXEC (команда) и DD (данные). Этого достаточно, чтобы писать простые задания. В следующих уроках мы углубимся в управление потоком заданий и условную логику, чтобы создавать по-настоящему умные автоматизированные процессы.

    5. Каталогизированные процедуры и условная обработка заданий

    Каталогизированные процедуры и условная обработка заданий

    Приветствую вас на пятом уроке курса «Основы JCL для начинающих». Мы уже прошли большой путь: научились создавать паспорт задания (JOB), запускать программы (EXEC) и управлять данными (DD). По сути, вы уже умеете писать работающий JCL-код.

    Однако в реальном мире корпоративных систем задания редко состоят из десяти строк. Обычно это сотни и тысячи строк кода. Если каждый раз писать всё с нуля, можно сойти с ума от количества рутины и ошибок. Кроме того, реальные бизнес-процессы нелинейны: если программа «А» упала, программу «Б» запускать нельзя.

    Сегодня мы превратимся из новичков в инженеров. Мы научимся двум вещам, которые отличают профессиональный JCL от учебного: Каталогизированные процедуры (PROCs) для повторного использования кода и Условная обработка (Conditional Processing) для управления логикой выполнения.

    Каталогизированные процедуры (PROCs)

    Представьте, что вы каждый день готовите сложный ужин. Каждый раз вы пишете список продуктов, инструкцию по нарезке и время жарки. Это долго. Умный повар один раз пишет рецепт, вешает его на стену и просто говорит помощнику: «Приготовь блюдо №5».

    В JCL такой «рецепт» называется Процедурой (Procedure или PROC).

    Каталогизированная процедура — это заранее написанный набор операторов JCL (обычно EXEC и DD), который сохранен в специальной системной библиотеке (PROCLIB). Вы можете вызывать этот набор в своих заданиях одной строкой.

    Зачем нужны процедуры?

  • Уменьшение дублирования: Если 50 программистов используют одну и ту же утилиту сортировки, нет смысла каждому писать одни и те же DD-карты. Опытный системный программист пишет процедуру один раз.
  • Простота поддержки: Если имя системной библиотеки изменится, администратор поправит его в одном месте (в процедуре), и оно автоматически обновится у всех тысяч пользователей.
  • Стандартизация: Все используют проверенный и оптимизированный код.
  • !Визуализация принципа работы каталогизированной процедуры: вызов короткой команды разворачивает сложный код.

    Структура и вызов процедуры

    Процедура начинается с оператора PROC и заканчивается оператором PEND (хотя в каталогизированных процедурах они часто опускаются).

    Допустим, у нас есть процедура с именем MYPROC, сохраненная в библиотеке:

    Чтобы использовать её в вашем задании, вы просто пишете:

    Когда z/OS видит EXEC MYPROC, она идет в библиотеку, берет код процедуры и подставляет его вместо вашей строки. Это называется расширением (expansion).

    Символические параметры

    Вы могли заметить странную запись &HLQ в примере выше. Это Символический параметр (Symbolic Parameter). Это переменная, значение которой вы задаете при запуске.

    Процедура — это шаблон. Но иногда нам нужно менять детали. Например, имя файла. В процедуре мы пишем &NAME, а при вызове указываем конкретное значение.

    Пример вызова с передачей параметра:

    Внутри процедуры &HLQ заменится на BANK, и имя файла станет BANK.MY.DATA.

    Переопределение (Overriding)

    Что делать, если процедура идеальна, но вам нужно изменить всего одну DD-карту? Неужели копировать весь код?

    Нет. JCL позволяет переопределять параметры процедуры из вызывающего задания. Для этого нужно знать имя шага внутри процедуры.

    Допустим, в процедуре MYPROC есть шаг STEP1 с картой DD1. Мы хотим изменить путь к файлу.

    Обратите внимание на синтаксис: //ИМЯ_ШАГА_В_ПРОЦЕДУРЕ.ИМЯ_DD. Система поймет, что нужно взять стандартную процедуру, но для DD1 использовать ваши настройки.

    Условная обработка: COND и IF/THEN

    Вторая тема нашего урока — логика. В пакетной обработке часто бывает так: «Если сортировка прошла успешно, запускай отчет. Если нет — завершай работу».

    В JCL есть два способа управления потоком:

  • Классический параметр COND (сложный и запутанный).
  • Современная конструкция IF/THEN/ELSE (простая и понятная).
  • Мы разберем оба, так как в старых системах вы часто будете встречать COND.

    Коды возврата (Return Codes)

    Вспомним, что любая программа при завершении выдает число — Return Code (RC). * 0 = Успех * 4 = Предупреждение * 8 = Ошибка * 12 = Серьезная ошибка * 16 = Фатальная ошибка

    Параметр COND (Condition)

    Параметр COND можно указывать в карте JOB (глобально) или EXEC (для конкретного шага).

    Главное правило COND, которое взрывает мозг новичкам:

    > В JCL параметр COND задает условие для ПРОПУСКА шага, а не для его запуска.

    Читайте это как: «Если условие ИСТИННО, то НЕ ЗАПУСКАТЬ этот шаг».

    Синтаксис:

    Операторы сравнения: * GT (Greater Than) — Больше () * LT (Less Than) — Меньше () * EQ (Equal) — Равно () * NE (Not Equal) — Не равно () * GE (Greater or Equal) — Больше или равно () * LE (Less or Equal) — Меньше или равно ()

    #### Разбор примера

    Как это прочитать?

  • Система смотрит на COND=(4,LT). Это читается как: «Если 4 меньше (), чем Код Возврата предыдущего шага».
  • Допустим, STEP1 завершился с кодом 0.
  • Проверяем: ? Ложь.
  • Условие ложно шаг НЕ пропускается STEP2 ЗАПУСКАЕТСЯ.
  • Допустим, STEP1 завершился с кодом 8.

  • Проверяем: ? Истина.
  • Условие истинно шаг ПРОПУСКАЕТСЯ.
  • Получается, что COND=(4,LT) означает: «Запускай шаг, только если предыдущие ошибки были не страшнее 4 (RC 4)». Это очень контринтуитивно, поэтому многие программисты вешают шпаргалки на монитор.

    !Логическая схема работы параметра COND: истинность условия ведет к пропуску действия.

    Конструкция IF/THEN/ELSE

    К счастью, IBM сжалилась над разработчиками и добавила в JCL нормальные конструкции IF, похожие на обычные языки программирования. Здесь логика прямая: «Если условие истинно, то ВЫПОЛНЯЙ».

    Синтаксис:

    В условии мы ссылаемся на коды возврата конкретных шагов (STEP1.RC) или просто RC (код последнего шага).

    Пример:

    Здесь всё прозрачно: Если STEP1 вернул 0, то запускаем STEP2. Если нет — пропускаем. Никакой инвертированной логики.

    Вы можете использовать те же операторы (GT, LT, EQ...) или математические символы (>, <, =).

    Что выбрать: COND или IF?

    * COND — старая школа. Вы обязаны его знать, потому что будете поддерживать код, написанный 20 лет назад. * IF/THEN — современный стандарт. Для нового кода лучше использовать его, так как он читабельнее и снижает вероятность ошибки.

    Резюме

    Сегодня мы сделали огромный шаг к профессиональному владению JCL.

  • Процедуры (PROC) позволяют создавать шаблоны кода, использовать их многократно и легко менять параметры через символические переменные (&VAR) или переопределение DD-карт.
  • COND — это механизм проверки ошибок с «перевернутой» логикой: «Если условие истинно — пропусти шаг».
  • IF/THEN/ELSE — более удобный и понятный способ управления логикой выполнения заданий.
  • Теперь вы можете писать гибкие задания, которые умеют реагировать на ошибки и использовать готовые наработки коллег. В следующей, заключительной статье базового курса, мы поговорим о том, как искать ошибки, читать системные логи и не паниковать, когда задание «упало» (ABEND).