JCL
Job Control Language (JCL) este un nume pentru limbile de scripting utilizate în sistemele de operare mainframe IBM pentru a instrui sistemul cu privire la modul de rulare a unei sarcini batch sau de a porni un subsistem.[1]
Mai precis, scopul JCL este să demonstreze programele care se execută, folosind fișierele sau dispozitivele[2] pentru intrare sau ieșire și uneori pentru a indica în ce condiții să săriți un pas.
Există două limbi distincte IBM Job Control:
- unul pentru linia sistemului de operare care începe cu DOS/360 și al cărui ultim membru este z/VSE;
- cealaltă pentru linia de origine de la OS/360 la z/OS, acesta din urmă cuprinzând extensiile JES, JECL (Job Entry Control Language).
Aceștia împărtășesc câteva reguli de sintaxă de bază și câteva concepte de bază, dar sunt foarte diferite.
DOS JCL
[modificare | modificare sursă]Poziționarea parametrilor
[modificare | modificare sursă]//TLBL TAPEFIL,'COPYTAPE.JOB',,,,2
//ASSGN SYS005,200
//DLBL DISKFIL,'COPYTAPE.JOB',0,SD
//EXTENT SYS005,VOL01,1,0,800,1600
Parametrii DOS JCL sunt poziționali, ceea ce le face mai greu să citească și să scrie, dar mai ușor pentru analiza sistemului.
- Programatorul trebuie să-și amintească ce element se află în poziția în fiecare tip de instrucțiune.
- În cazul în care unii parametri opțional sunt omiși, dar mai târziu sunt incluși, parametrii omiși trebuie să fie reprezentați prin virgule fără spații, ca în instrucțiunea TLBL de mai sus.
DOS JCL într-o oarecare măsură diminuează dificultățile parametrilor poziționali prin utilizarea mai multor instrucțiuni cu parametri mai puțini decât OS JCL. În exemplu, instrucțiunile ASSGN, DLBL și EXTENT fac aceeași lucrare (specificând unde trebuie stocat un nou fișier disc) ca o singură instrucțiune DD
în OS JCL.
Disponibilitatea dispozitivului
[modificare | modificare sursă]În versiunea originală DOS/360 și în majoritatea versiunilor DOS/VS, a fost necesar să se precizeze numărul de model al dispozitivului care urma să fie utilizat pentru fiecare fișier disc sau bandă - chiar și pentru fișierele existente și pentru fișierele temporare care urmau să fie șterse la sfârșitul locului de muncă. Acest lucru însemna că, dacă un client a fost modernizat la un echipament mai modern, multe fișiere JCL trebuiau să fie schimbate.
Mai târziu, membrii familiei DOS / 360 au redus numărul de situații în care erau necesare numerele de model pentru dispozitive.
Alocarea filelor manuale
[modificare | modificare sursă]DOS/360 a cerut inițial programatorului să specifice locația și dimensiunea tuturor fișierelor de pe DASD. Cardul EXTENT
specifică volumul pe care se află amploarea, piesa absolută de pornire și numărul de piste. pentru z/VSE un fișier poate avea până la 256 extensii pe volume diferite.
OS JCL
[modificare | modificare sursă]OS JCL constă din trei tipuri de declarații de bază:[3]
- Declarația
JOB
, care identifică începutul lucrării și informații despre întreaga activitate, cum ar fi facturarea, prioritatea de rulare și limitele de timp și spațiu. - Instrucțiunea
EXEC
, care identifică programul sau procedura[4] care trebuie executate în acest pas al lucrării,
și informații despre pas, inclusiv CONDitions pentru a rula sau a sări peste un pas.
DD
(Definirea datelor), care identifică un fișier de date care va fi utilizat într-un pas și informații detaliate despre acel fișier. DeclarațiileDD
pot fi în orice ordine în cadrul etapei.
Chiar de la început, JCL pentru familia OS (până la și inclusiv z/OS) a fost mai flexibilă și mai ușor de utilizat.
Următoarele exemple utilizează stilul vechi de sintaxă care a fost furnizat încă de la lansarea System/360 în 1964. Vechea sintaxă este încă destul de obișnuită în lucrările care se desfășoară de peste 20 de ani, cu doar mici modificări.
Reguli pentru codificarea declarațiilor JCL
[modificare | modificare sursă]Fiecare declarație JCL este împărțită în 5 câmpuri.
Identifier-Field Name-Field Operation-Field Parameter-Field Comments-Field ^ ^ ^ ^ no space space space space
Identifier-Field trebuie să fie concatenat cu câmpul Name-Field, adică nu trebuie să existe spații între ele.
- Identifier-Field (
//
): Câmpul de identificare indică sistemului că o instrucțiune este o instrucțiune JCL, nu o dată. Câmpul de identificare constă din următoarele:- Coloanele 1 și 2 ale tuturor instrucțiunilor JCL, cu excepția instrucțiunii de delimiter, conțin
//
- Coloanele 1 și 2 ale instrucțiunii delimitatorului conțin
/*
- Coloanele 1, 2 și 3 ale unei declarații de comentariu JCL conțin
//*
- Coloanele 1 și 2 ale tuturor instrucțiunilor JCL, cu excepția instrucțiunii de delimiter, conțin
- Name-Field: Câmpul nume identifică o anumită declarație, astfel încât alte declarații și sisteme să se poată referi la ea. Pentru declarațiile JCL, acesta trebuie codat după cum urmează:
- Numele trebuie să înceapă în coloana 3.
- Numele este de la 1 la 8 alfanumeric sau național (
$
,#
,@
) caractere. - Primul caracter trebuie să fie alfabetic.
- Numele trebuie să fie urmat de cel puțin un gol.
- Operation-Field: Câmpul de operare specifică tipul de instrucțiune sau, pentru comandă. Operation-Field ar trebui să fie codificate după cum urmează:
- Câmpul de operație constă din caracterele din caseta de sintaxă pentru instrucțiune.
- Operațiunea urmează câmpul cu numele.
- Operațiunea trebuie să fie precedată și să fie urmată de cel puțin un semifabricat.
- Operațiunea va fi una dintre
JOB
,EXEC
sauDD
.
- Parameter-Field: Câmpul de parametri, denumit uneori câmpul operand, conține parametri separați prin virgule. Câmpul de parametri trebuie codat după cum urmează:
- Câmpul parametrilor urmează câmpul de operare.
- Câmpul de parametri trebuie să fie precedat de cel puțin un gol.
- Câmpul parametru conține parametri care sunt cuvintele cheie utilizate în instrucțiune pentru a furniza informații cum ar fi numele programului sau setul de date.
- Comments-Field: Aceasta conține comentarii. Comments-Field ar trebui să fie codificate după cum urmează:
- Câmpul de comentarii urmează câmpul parametru.
- Câmpul de comentarii trebuie să fie precedat de cel puțin un gol.
Parametrii cuvintelor cheie
[modificare | modificare sursă]//NEWFILE DD DSN=MYFILE01,UNIT=DISK,SPACE=(TRK,80,10),
// DCB=(LRECL=100,BLKSIZE=1000),
// DISP=(NEW,CATLG,DELETE)
Toți parametrii majori ai declarațiilor OS JCL sunt identificați prin cuvinte cheie și pot fi prezenți în orice ordine. Câteva dintre acestea conțin doi sau mai mulți sub-parametri, cum ar fi SPACE
(cât de mult spațiu de disc să aloce unui fișier nou) și DCB
(specificație detaliată a aspectului fișierului) în exemplul de mai sus. Sub-parametrii sunt uneori poziționali, ca în SPACE
, dar cei mai complexi parametri, cum ar fi DCB
, au sub-parametri de cuvinte cheie.
Parametrul de poziție trebuie să fie precedat de parametrii de cuvinte cheie. Parametrii cuvintelor cheie atribuie întotdeauna valori unui cuvânt cheie utilizând semnul egal (=
).
Accesul la date
[modificare | modificare sursă]Declarația DD
este utilizată pentru a trimite date. Această declarație face legătura între descrierea internă a unui set de date a unui program și datele pe dispozitivele externe: discuri, casete, carduri, imprimante etc. DD poate furniza informații cum ar fi un tip de dispozitiv (de ex. "181", "2400-5", "TAPE"), un număr de serie pentru casete sau discuri și descrierea fișierului de date, denumit sub-parametru DCB
după Blocul de control al datelor (DCB) din programul utilizat pentru identificarea fișierului. Informațiile care descriu fișierul pot proveni din trei surse: informațiile despre cartea DD, informațiile despre eticheta setului de date pentru un fișier existent stocat pe bandă sau pe disc și macrocomanda DCB codată în program. Când fișierul este deschis, aceste date sunt fuzionate, informațiile DD având prioritate față de informațiile de pe etichetă și informațiile DCB au prioritate față de ambele. Descrierea actualizată este apoi scrisă înapoi la eticheta setului de date. Acest lucru poate duce la consecințe neintenționate dacă sunt furnizate informații DCB incorecte.[5]
Independența dispozitivului
[modificare | modificare sursă]De la bun început, JCL pentru familia OS de sisteme de operare a oferit un grad înalt de independență a dispozitivului. Chiar și pentru fișierele noi care urmau să fie păstrate după terminarea lucrării, s-ar putea specifica tipul de dispozitiv în termeni generici, de exemplu, UNIT=DISK
or UNIT=TAPE
. Desigur, dacă este important, se poate specifica un număr de model sau chiar o adresă specifică a dispozitivului.
Proceduri
[modificare | modificare sursă]Procedurile permit gruparea uneia sau mai multor instrucțiuni "EXEC PGM=" și DD și apoi invocarea acestora cu "EXEC PROC= procname" sau pur și simplu "EXEC procname"[6]
O facilitate numită Bibliotecă de proceduri a permis procedurile de stocare prealabilă.
PROC & PEND
[modificare | modificare sursă]De asemenea, procedurile pot fi incluse în fluxul de locuri de muncă prin încheierea procedurii cu o instrucțiune // PEND
, apoi invocând-o cu același nume ca și cum ar fi fost într-o bibliotecă de proceduri.
De exemplu:
//SUMPRINT PROC
//PRINT EXEC PGM=IEBGENER
//SYSUT1 DD DSN=CEO.FILES.DAYEND.RPT24A,DISP=SHR
//SYSUT2 DD SYSOUT=A
//SYSIN DD DUMMY
// PEND
// EXEC SUMPRINT
Proceduri parametrizate
[modificare | modificare sursă]Procedurile OS JCL au fost parametrizate de la început, făcându-le mai degrabă ca macro-uri sau chiar simple subrutine, crescând astfel reutilizarea acestora într-o gamă largă de situații.
//MYPROC PROC FNAME=MYFILE01,SPTYPE=TRK,SPINIT=50,SPEXT=10,LR=100,BLK=1000
.....
//NEWFILE DD DSN=&FNAME,UNIT=DISK,SPACE=(&SPTYPE,&SPINIT,&SPEXT),
// DCB=(LRECL=&LR,BLKSIZE=&BLK),DISP=(NEW,CATLG,DELETE)
....
În acest exemplu, toate valorile care încep cu ampersands "&
" sunt parametrii care vor fi specificați când o lucrare cere ca procedura să fie utilizată. Instrucțiunea PROC, pe lângă faptul că dă procedură un nume, permite programatorului să specifice valorile implicite pentru fiecare parametru. Deci, s-ar putea folosi procedura din acest exemplu pentru a crea noi fișiere de diferite mărimi și machete diferite. De exemplu:
//JOB01 JOB ..........
//STEP01 EXEC MYPROC FNAME=JOESFILE,SPTYPE=CYL,SPINIT=10,SPEXT=2,LR=100,BLK=2000
or
//JOB02 JOB ..........
//STEP01 EXEC MYPROC FNAME=SUESFILE,SPTYPE=TRK,SPINIT=500,SPEXT=100,LR=100,BLK=5000
Referbacks
[modificare | modificare sursă]În lucrările cu mai multe etape, un pas ulterior poate utiliza o trimitere în loc să precizeze în întregime un fișier care a fost deja specificat într-un pas anterior. De exemplu:
//MYPROC ................
//MYPR01 EXEC PGM=..........
//NEWFILE DD DSN=&MYFILE,UNIT=DISK,SPACE=(TRK,50,10),
// DCB=(LRECL=100,BLKSIZE=1000),DISP=(NEW,CATLG,DELETE)
....
//MYPR02 EXEC PGM=..........
//INPUT01 DD DSN=*.MYPR01.NEWFILE
Aici, MYPR02
folosește fișierul identificat ca NEWFILE
în pasul MYPR01
(DSN
înseamnă "numele setului de date" și specifică numele fișierului).
În lucrările care conțin un amestec de JCL specifice locului de muncă și apeluri de procedură, un pas specific unui loc de muncă se poate referi la un fișier care a fost specificat pe deplin într-o procedură, de exemplu:
//MYJOB JOB ..........
//STEP01 EXEC MYPROC Using a procedure
//STEP02 EXEC PGM=......... Step which is specific to this job
//INPUT01 DD DSN=*.STEP01.MYPR01.NEWFILE
unde DSN=*.STEP01.MYPR01.NEWFILE
înseamnă "utilizați fișierul identificat ca NEWFILE
în pasul MYPR01
al procedurii utilizate de pasul STEP01
al acestei lucrări". Folosind numele pasului care a denumit procedura mai degrabă decât numele procedurii permite unui programator să utilizeze aceeași procedură de mai multe ori în aceeași lucrare fără confuzie cu privire la ce instanță a procedurii este utilizată în referire.
Comentarii
[modificare | modificare sursă]Fișierele JCL pot fi lungi și complexe, iar limba nu este ușor de citit. (JCL a fost descris ca "utilizator ostil".) OS JCL permite programatorilor să includă două tipuri de comentarii explicative:
- Pe aceeași linie ca o instrucțiune JCL. Ele pot fi extinse prin plasarea unui caracter continuu (în mod convențional "
X
") în coloana 72, urmată de "//
" în coloanele 1-3 de pe linia următoare. - Linii care conțin numai comentarii, folosite adesea pentru a explica aspecte importante despre structura generală a JCL, nu pentru detalii locale. Liniile care utilizează linkuri sunt, de asemenea, folosite pentru divizarea fișierelor lungi, complexe JCL în secțiuni.
//MYJOB JOB ..........
//* Lines containing only comments.
//******** Often used to divide JCL listing into sections ********
//STEP01 EXEC MYPROC Comment 2 on same line as statement
//STEP02 EXEC PGM=......... Comment 3 has been extended and X
// overflows into another line.
//INPUT01 DD DSN=STEP01.MYPR01.NEWFILE
Concatenarea fișierelor de intrare
[modificare | modificare sursă]OS JCL permite programatorilor să concatine ("lanț") fișierele de intrare, astfel încât acestea să apară la program ca un singur fișier, de exemplu
//INPUT01 DD DSN=MYFILE01,DISP=SHR
// DD DSN=JOESFILE,DISP=SHR
// DD DSN=SUESFILE,DISP=SHR
A doua și a treia declarație nu au nicio valoare în câmpul de nume, așa că OS le tratează ca concatenări. Fișierele trebuie să fie de același tip de bază (aproape întotdeauna secvențială) și trebuie să aibă aceeași lungime de înregistrare, totuși lungimea blocului nu trebuie să fie aceeași.
În versiunile inițiale ale sistemului de operare (cu siguranță înainte de OS/360 R21.8), lungimea blocului trebuie să fie în ordine descrescătoare sau utilizatorul trebuie să inspecte fiecare instanță și să anexeze la instrucțiunea DD numită lungimea maximă a blocului găsită,
//INPUT01 DD DSN=MYFILE01,DISP=SHR,BLKSIZE=800
// DD DSN=JOESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 800)
// DD DSN=SUESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 800)
În versiunile ulterioare ale sistemului de operare (cu certitudine după OS/MVS R3.7 cu "unitățile selectabile"), OS, în timpul alocării, ar inspecta fiecare instanță într-o concatenare și ar substitui lungimea maximă a blocurilor care a fost găsită.
O alternativă obișnuită a fost de a determina pur și simplu lungimea maximă posibilă a blocului de pe dispozitiv și de a specifica că pe instrucțiunea DD numită, ca de exemplu,
//INPUT01 DD DSN=MYFILE01,DISP=SHR,BLKSIZE=8000
// DD DSN=JOESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 8000)
// DD DSN=SUESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 8000)
Scopul acestei măsuri de rezervă a fost să se asigure că metoda de acces va aloca un set de tampoane de intrare suficient de mare pentru a se potrivi cu toate seturile de date specificate.
Prelucrarea condiționată
[modificare | modificare sursă]Sistemul de operare așteaptă ca programele să stabilească un cod de retur care specifică modul în care programul a crezut că a fost. Cele mai comune valori convenționale sunt:[7]
- 0 = Normal - toate sunt OK
- 4 = Avertisment - erori minore sau probleme
- 8 = Eroare - erori sau probleme semnificative
- 12 = Eroare severă - erori majore sau probleme, rezultatele (de ex., Fișierele sau rapoartele produse) nu ar trebui să fie de încredere.
- 16 = Eroare terminal - probleme foarte grave, nu folosiți rezultatele!
OS JCL se referă la codul de returnare ca COND
("cod de condiție") și îl poate utiliza pentru a decide dacă să execute pașii ulteriori. Cu toate acestea, spre deosebire de cele mai moderne limbi de programare, pașii condiționați în OS JCL nu sunt executați dacă condiția specificată este adevărată - dând astfel naștere la mnemonic: "Dacă este adevărat, treceți prin [fără a rula codul]". Pentru a complica lucrurile în continuare, condiția poate fi specificată numai după pasul la care se referă. De exemplu:
//MYJOB JOB ...........
//STEP01 EXEC PGM=PROG01
....
//STEP02 EXEC PGM=PROG02,COND=(4,GT,STEP01)
....
//STEP03 EXEC PGM=PROG03,COND=(8,LE)
....
//STEP04 EXEC PGM=PROG04,COND=(ONLY,STEP01)
....
//STEP05 EXEC PGM=PROG05,COND=(EVEN,STEP03)
....
mijloace:
- Rulați STEP01 și colectați codul de retur.
- Nu executați STEP02 dacă numărul 4 este mai mare decât codul de retur al STEP01.
- Nu executați STEP03 dacă numărul 8 este mai mic sau egal cu orice cod de retur anterior.
- Rulați STEP04 numai dacă STEP01 sa încheiat anormal.
- Rulați STEP05, chiar dacă STEP03 sa încheiat anormal.
Aceasta se referă la următorul pseudocod:
run STEP01 if STEP01's return code is greater than or equal to 4 then run STEP02 end if if any previous return code is less than 8 then run STEP03 end if if STEP01 abnormally ended then run STEP04 end if if STEP03 abnormally ended then run STEP05 else run STEP05 end if
Utilități
[modificare | modificare sursă]Locurile de muncă utilizează un număr de programe utilitare IBM pentru a ajuta la prelucrarea datelor. Utilitățile sunt cele mai utile în procesarea loturilor. Utilitățile pot fi grupate în trei seturi:
- Seturi de utilități - creați, imprimați, copiați, mutați și ștergeți seturile de date.
- Utilități de sistem - Menținerea și gestionarea cataloagelor și a altor informații despre sistem.
- Metode de acces Servicii - Procesare metodă de stocare virtuală (VSAM) și seturi de date non-VSAM.
Vezi și
[modificare | modificare sursă]- dd (Unix) Programul Unix inspirat de
DD
Note
[modificare | modificare sursă]- ^ "Every job submitted for execution ... must include JCL statements" -- ibm.com
- ^ and many more complex details, such as whether the file is to be retained or deleted, the maximum of disk space to which it can grow, the name of a tape to be pre-mounted
- ^ and 2 additional statements, PROC & PEND, to test Procedures
- ^ A pre-stored set of "EXEC PGM=" and "DD" JCL commands which could be parameterized
- ^ IBM Corporation (august 1978). OS/VS MVS Data Management Services Guide (PDF). Accesat în .
- ^ the default for the EXEC statement is PROC=
- ^ Brown, Gary DeWard (). zOS JCL (ed. fifth). John Wiley & Sons. p. 248. ISBN 0471-236357.