Как я могу запустить свою программу Rexx как пакетное задание?
У меня есть программа Rexx, которую я хочу запустить как пакетное задание. Как я могу это сделать?
Это моя программа:-
/* Rexx – HELLO – Write Hello World */
Say "hello World"
Программа расположена как участник HELLO
в ПДС ME.USER.EXEC
,
Действительная JOB CARD для моей установки: (наша среда включает ISPF/PDF, а не ROSCOE):-
//MYJOB JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
Заметка! это было написано как учебник
4 ответа
Существует несколько способов запуска программы через пакетный режим. Я расскажу о трех способах, которые различаются в зависимости от среды (то есть, что они могут использовать).
Способ 1 - Запустите программу в среде Rexx.
Это влечет за собой запуск программы IRXJCL и передачу имени программы (то есть имени члена PDS) через поле PARM (вы также можете передавать параметры; доступ к ним осуществляется через оператор PARSE ARG).
IRXJCL требует (обычно) 3 DDNAMES, это SYSEXEC (PDS, на котором расположена программа), SYSTSIN (это может отражать входной сигнал терминала) и SYSTSPRT (именно туда отправляется выходной сигнал терминала).
Вот JCL, который будет работать в соответствии с информацией, представленной выше:
//MYJOB JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
//*-------------------------------------------------------------------
//RUNPROG EXEC PGM=IRXJCL,PARM=’HELLO’
//*
//* RUN OUR REXX PROGRAM CALLED HELLO
//*
//SYSEXEC DD DSN=ME.USER.EXEC,DISP=SHR
//SYSTSIN DD DUMMY
//SYSTSPRT DD SYSOUT=*
//*-------------------------------------------------------------------
Этот метод, хотя и является самым простым (всего несколькими строками JCL), является наиболее ограничительным в том смысле, что он не позволяет использовать службы TSO/E, такие как команды TSO/E и большинство внешних функций TSO/E.
Однако, поскольку IRXJCL является процессором Rexx, нет необходимости сообщать TSO/E, что это программа Rexx (первая строка должна включать REXX).
Способ 2 - запустить программу из среды TSO/E
Это влечет за собой запуск одной из программ пакетной обработки TSO/E, в этом примере используется IKJEFT01. Альтернативы IKJEFT1A и IKJEFT1B. С помощью этого метода могут использоваться службы и команды TSO/E (например, примечание в конце этого метода с использованием команды TIME)
Всестороннюю информацию о различиях между программами можно найти в Writing JCL для выполнения команд.
JCL для IKJEFT01 аналогичен тому, который используется в методе 1. Можно кодировать дополнительный DDNAME SYSPROC. SYSPROC - это DDNAME, в котором будут находиться CLISTS; В дополнение к SYSEXEC вы можете найти здесь программы Rexx (которые не требуются, но предполагается, что обе программы закодированы и SYSEXEC используется для программ Rexx, а SYSPROC - для CLISTS).
Это требование, что Rexx находится на первой строке, которая отличает программу Rexx от CLIST (процессором TSO/E). Таким образом, если программа Rexx найдена / расположена через SYSEXEC, если я правильно помню, это отменяет требование).
Другое предложение - всегда включать REXX в первую строку программы Rexx>
Оператор EXEC вызывает программу IKJEFT01 вместо IRXJCL. PARM может использоваться для указания первой команды (и, следовательно, нашей программы HELLO). Однако, что касается переднего плана, вы можете указать это через терминал, то есть SYSTSIN DDNAME.
Вот некоторые JCL, которые будут работать для второго метода; отмечая, что программа HELLO вызывается через SYSTNIN DDNAME как данные instream:
//MYJOB JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
//*-------------------------------------------------------------------
//RUNPROG EXEC PGM=IKJEFT01
//*
//* RUN OUR REXX PROGRAM CALLED HELLO IN A TSO/E ENVIRONMENT
//*
//SYSPROC DD DSN=ME.USER.CLIST,DISP=SHR
//SYSEXEC DD DSN=ME.USER.EXEC,DISP=SHR
//SYSTSIN DD *
HELLO
//SYSTSPRT DD SYSOUT=*
//*-------------------------------------------------------------------
Если, например, было использовано следующее (то есть добавлено TIME в качестве еще одной строки в SYSTSIN), то будет выполнена команда TSO/E TIME (что приведет к отображению времени в SYSTSPRT).
//SYSTSIN DD * HELLO TIME
Способ 3 - запустить программу в среде ISPF
Этот метод использует программу IKJEFT01 (см. Способ 2 для альтернатив IKJEFT1A/B). Однако затем он использует команду ISPSTART для запуска программы в среде ISPF; возможность использования служб ISPF (например, адаптация файлов (скелетов) таблиц ISPF и т. д.).
К среде ISPF предъявляются дополнительные требования: библиотеки ISPF должны быть выделены для запуска среды ISPF. Как минимум, предоставленные библиотеки ISPF должны быть выделены для ddnames ISPPLIB (панели ISPF), ISPMLIB (сообщения ISPF) и ISPTLIB (таблицы ISPF). ISPPROF - это место, где ISPF хранит некоторые данные профиля для сеанса, поэтому достаточно временного хранилища (UNIT=SYSDA часто доступно, если не всегда).
Обратите внимание, что вы, вероятно, выделите, как минимум, системные библиотеки установки (команда TSO/E LISTA, вероятно, может использоваться для определения их из сеанса переднего плана). В качестве альтернативы, спросите у вас местных дружественных системных программистов. В дальнейшем это SYS1.ISPPLIB, SYS1.ISPMLIB и SYS1.ISPTLIB.
Вот некоторые JCL, которые будут работать для 3-го метода. Обратите внимание, что HELLO передается в качестве параметра команде ISPSTART.
//MYJOB JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
//*-------------------------------------------------------------------
//RUNPROG EXEC PGM=IKJEFT01
//*
//* RUN OUR REXX PROGRAM HELLO IN A TSO/E/ISPF ENVIRONMENT
//*
//SYSPROC DD DSN=ME.USER.CLIST,DISP=SHR
//SYSEXEC DD DSN=ME.USER.EXEC,DISP=SHR
//ISPPLIB DD DSN=SYS1.ISPPLIB,DISP=SHR
//ISPMLIB DD DSN=SYS1.ISPMLIB,DISP=SHR
//ISPTLIB DD DSN=SYS1.ISPTLIB,DISP=SHR
//ISPPROF DD UNIT=SYSDA,SPACE=(CYL,(10,1)),
// RECFM=FB,LRECL=80,BLKSIZE=0
//SYSTSIN DD *
ISPSTART CMD(HELLO)
//SYSTSPRT DD SYSOUT=*
//*-------------------------------------------------------------------
Обратите внимание, что это не является исчерпывающим, это обзор, который должен быть достаточным для начала работы с программами Rexx в пакетном режиме.
Дополнительные комментарии к ответу выше. Техническое примечание ниже может быть полезным, если вы хотите запустить REXX exec с использованием служб ISPF...
http://www.ibm.com/support/docview.wss?uid=swg21023990
Убедитесь, что файл ISPPROF объединен как первый файл в ISPTLIB. В примере используется временный файл, который будет уникальным для задания. Если REXX exec выполняет обслуживание таблиц, вам может потребоваться ISPTABL DD. Я бы предложил использовать один и тот же файл для ISPPROF и ISPTABL и объединить его сначала в ISPTLIB. Это может быть постоянный файл, если таблицу необходимо сохранить, однако она не должна использоваться другими заданиями или пользователями TSO, чтобы избежать ошибок в очереди.
Как указывалось в предыдущем обновлении, его ответов достаточно для простого REXX exec.
Еще больше дополнительных комментариев к ответу MikeT...
Предположим, вы хотите, чтобы ваш JCL был автономным: вы хотите включить REXX exec в качестве входного потока данных в JCL, а не ссылаться на REXX exec, хранящийся в элементе PDS.
Вот "трюк" (для IRXJCL; я не проверял этот трюк с другими программами): укажите один нулевой (X'00') байт в качестве значения PARM
атрибут EXEC
заявление.
Чтобы указать нулевой байт, используйте редактор ISPF z / OS с HEX ON
:
//REXX EXEC PGM=IRXJCL,PARM=' '
66DCEE44444CECC4DCD7CDEDCD6DCDD7707
1195770000057530774E997133B7194ED0D
Например, если вы ввели PARM=' '
с пробелом в качестве значения, замените 4
шестнадцатеричного значения этого пространства с 0
,
Вот пример шага задания, содержащего исполняемый поток REXX, который обрабатывает выходные данные предыдущего шага в том же задании:
//* PARM value is a single X'00' byte
//REXX EXEC PGM=IRXJCL,PARM=' '
//SYSEXEC DD DATA,DLM=$$
/*
Transposes first line of input CSV into one record per field
Reads CSV from ddname SYSTSIN.
Writes output to ddname SYSTSPRT.
*/
columnSeparator = ","
/* Get the header row */
parse pull row
/* Get column names */
do i = 1 until row = ""
parse value row with columnName "," row
say columnName
end
exit 0
$$
//SYSTSIN DD DSN=&&CSV,DISP=OLD
//SYSTSPRT DD SYSOUT=*
Заметки:
- В этом контексте первая строка REXX exec не должна содержать строку "REXX"
DLM=$$
позволяет использовать синтаксис комментариев REXX (/*
) без преждевременного завершения набора данных в потоке&&CSV
ссылается на файл CSV, созданный на предыдущем шаге задания (не показан)
Я использую эту технику "in-stream REXX" в основном для специальных исполняющих программ, чтобы преобразовать вывод пакетной программы в то, что я действительно хочу. Этот метод может быть полезен для демонстраций и быстрого распространения идей; другие разработчики могут просматривать код REXX на месте в JCL в выводе SDSF, настраивать его, а затем отправлять настроенную версию.
Еще больше дополнительных комментариев к ответу MikeT..
В примере 2 вы можете указать имя программы в качестве параметра IKJEFT01, например:
//MYJOB JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
//*-------------------------------------------------------------------
//RUNPROG EXEC PGM=IKJEFT01,PARM='HELLO'
//*
//* RUN OUR REXX PROGRAM CALLED HELLO IN A TSO/E ENVIRONMENT
//*
//SYSPROC DD DSN=ME.USER.CLIST,DISP=SHR
//SYSEXEC DD DSN=ME.USER.EXEC,DISP=SHR
//SYSTSIN DD DUMMY
//SYSTSPRT DD SYSOUT=*
//*-------------------------------------------------------------------