#mainframe #zos #jcl
Вопрос:
Мне нужно установить тайм-аут на шаге JCL, который вызывает сценарий Unix через bpxbtach. Я сделал это с
//STEPX EXEC PGM=BPXBATCH, PARM='sh /x.sh',TIME=(,10)
Однако через некоторое время я понял, что не учитываю время в очереди. они говорят: «Это время выполнения относится только к фактическому времени выполнения и не включает время, которое задание проводит в очередях ВВОДА или УДЕРЖАНИЯ ВВОДА». https://supportline.microfocus.com/documentation/books/rd60/cbwjto.htm
Это microfocus JCL, но я проверил, что поведение такое же и на IBM Z тоже.
Поэтому, даже если я установлю тайм-аут на 10 секунд, этот шаг может занять несколько минут, если очередь занята другими делами. Мне нужен тайм-аут, который убьет этот шаг, независимо от причины, по которой он занял так много времени. Я не смог найти то, что мне нужно. Пожалуйста, помогите.
Комментарии:
1. Почему ты пытаешься это сделать? Задания по определению являются пакетной работой. Если вам нужно что-то завершить за 10 секунд, вам нужно предпринять другие шаги. Вы также объединяете этапы работы и задания. Я бы предложил задать вопрос, описывающий, что вы
2. Я думаю, что это проблема » XY «- вы пытаетесь решить проблему «X», когда вам на самом деле нужно решить проблему «Y». За более чем 30 лет работы на мэйнфреймах я никогда не видел требования отменить пакетное задание, если оно не было выполнено в течение 10 секунд после запуска. Пакетные задания в такой степени не зависят от времени. Теперь вам может потребоваться запустить сценарий в течение 10 секунд после какого-либо события, поэтому я бы спросил ваших системных программистов, есть ли у вас пакет автоматизации, такой как Ops/MVS, AF/Operator или Системная автоматизация IBM.
3. 10 секунд и эта строка кода были просто для примера…
Ответ №1:
пакет z/OS действительно не лучший выбор для работы, требующей много времени. Как вы уже поняли, параметр JCL «ВРЕМЯ» касается потребления процессорного времени, а не контроля прошедшего времени. Если это критически важная для бизнеса необходимость, то обязательно поговорите с администраторами z/OS-они, безусловно, могут настроить вашу систему таким образом, чтобы ваша работа, скорее всего, выполнялась без задержек, но обычно это не поведение по умолчанию.
Вы не предоставляете много подробностей о том, чем еще может заниматься ваша работа и как она будет представлена. Если у вас есть возможность контролировать отправку задания, одним из вариантов может быть создание сценария оболочки напрямую, а не отправка пакетного процесса для запуска сценария.
Например, то, что вы описали, — это отправка JCL, которая порождает BPXBATCH, затем BPXBATCH порождает ваш сценарий оболочки. Вместо этого вы можете написать небольшую программу на языке Си, которая просто вызывает «spawn()» для запуска оболочки как отдельного процесса UNIX — это не сложно, в зависимости от того, как вы отправляете JCL, которым вы поделились. Вы избавляетесь от необходимости в пакетном задании — просто запустите свой сценарий напрямую.
Если вы работаете в среде TSO, команда OSHELL позволяет вам интерактивно запускать сценарий. Вы даже можете автоматизировать весь процесс с помощью простого скрипта REXX, и для этого не требуется проходить через инициатор пакета.
Если ваш сайт работает по протоколу SSH или аналогичному, вы можете запустить свой скрипт с помощью команды SSH — это работает даже в сети. SSH позволяет запустить сеанс оболочки и передать команду для выполнения…опять же, здесь нет JCL или очереди ввода.
Если бы ваши администраторы разрешили это, другой альтернативой было бы запустить JCL с помощью команды «ПУСК». В отличие от пакетного JCL, при появлении команды ЗАПУСКА работа, которую вы начинаете, выполняется немедленно — для запущенных задач нет очереди ввода. Команды запуска также могут быть выданы из JCL, и поскольку они выдаются при сканировании JCL, а не при запуске задания, они также выполняются довольно быстро.
Внутри вашего сценария оболочки довольно легко установить ограничение по истекшему времени — здесь есть примеры.
Комментарии:
1. Спасибо за подробный ответ, я считаю, что правильный ответ-просто не использовать JCL для важных по времени задач, однако в этом случае и в некоторых других, почти по политическим причинам, это должен быть JCL, а bpxbatch-единственное, что может взаимодействовать с unix, oshell нельзя запускать намного меньше ssh. С теми привилегиями, которые у меня есть, НАЧАЛО, казалось, работало. Спасибо
Ответ №2:
Я вижу пару проблем в вашем коде…
//STEPX EXEC PGM=BPXBATCH, PARM='sh /x.sh',TIME=(,10)
Во-первых, у вас есть пробел между BPXBATCH,
и PARM=
, который не будет выполнять ваш сценарий оболочки и может привести к ошибке JCL.
Во-вторых, вы используете TIME
параметр инструкции EXEC, который ограничивает время процессора, но при этом ссылаетесь на желание отменить шаг задания, если он ожидает больше определенного времени во входной очереди, что является ограничением по времени.
Невозможно отменить задание из самого задания с помощью параметров JCL, основанных на тактовом времени, включая или исключая время, проведенное во входной очереди.
Если вам действительно нужно это сделать, я предлагаю вам изучить возможности пакета планировщика заданий вашего магазина. Возможно, вам захочется пересмотреть, почему вам нужно отменить задание, если оно не будет выполнено в течение 10 секунд после его отправки.