Limba de control al postului - Job Control Language

Job Control Language ( JCL ) este un nume pentru limbajele de scripturi utilizate pe sistemele de operare mainframe IBM pentru a instrui sistemul despre cum să ruleze un job batch sau să pornească un subsistem.

Mai precis, scopul JCL este de a spune ce programe să ruleze, folosind ce fișiere sau dispozitive pentru intrare sau ieșire și, uneori, să indice și în ce condiții să omiteți un pas.

Există două limbi distincte IBM Job Control:

Acestea împărtășesc câteva reguli de sintaxă de bază și câteva concepte de bază, dar altfel sunt foarte diferite. Sistemul de operare VM nu are JCL ca atare; componentele CP și CMS au fiecare limbaje de comandă .

Terminologie

Anumite cuvinte sau fraze utilizate împreună cu JCL sunt specifice tehnologiei mainframe IBM.

  • Set de date: un „set de date” este un fișier; poate fi temporar sau permanent și poate fi localizat pe o unitate de disc, stocare pe bandă sau alt dispozitiv.
  • Membru: un „membru” al unui set de date partiționat (PDS) este un set de date individual dintr-un PDS. Un membru poate fi accesat prin specificarea numelui PDS cu numele de membru între paranteze. De exemplu, macrocomanda de sistem GETMAIN din SYS1.MACLIB poate fi referită ca SYS1.MACLIB (GETMAIN).
  • Set de date partiționat: un „set de date partiționat” sau PDS este o colecție de membri sau arhivă, utilizată de obicei pentru a reprezenta bibliotecile de sistem. La fel ca în majoritatea acestor structuri, un membru, odată stocat, nu poate fi actualizat; membrul trebuie șters și înlocuit, cum ar fi cu utilitarul IEBUPDTE . Seturile de date partiționate sunt aproximativ similare cu bibliotecile statice bazate pe ar în sistemele bazate pe Unix.
  • USS: servicii de sistem Unix, un subsistem Unix care rulează ca parte a MVS și care permite fișierelor, scripturilor, sarcinilor și programelor Unix să ruleze pe un mainframe într-un mediu UNIX.

Motivație

Inițial, sistemele mainframe erau orientate spre procesarea în serie . Multe lucrări în serie necesită configurare, cu cerințe specifice pentru stocarea principală și dispozitive dedicate, cum ar fi benzi magnetice , volume de discuri private și imprimante configurate cu formulare speciale. JCL a fost dezvoltat ca un mijloc de a asigura că toate resursele necesare sunt disponibile înainte ca un job să fie programat să ruleze. De exemplu, multe sisteme, cum ar fi Linux permit identificarea seturilor de date necesare pentru a fi specificate pe linia de comandă și, prin urmare, supuse înlocuirii de către shell sau generate de program în timpul rulării. Pe aceste sisteme, programatorul de lucrări al sistemului de operare are puțină sau deloc idee despre cerințele jobului. În schimb, JCL specifică în mod explicit toate seturile de date și dispozitivele necesare. Planificatorul poate prealoca resursele înainte de a elibera lucrarea pentru a rula. Acest lucru ajută la evitarea „ blocajului ”, unde jobul A deține resursa R1 și solicită resursa R2, în timp ce executarea concomitentă a jobului B deține resursa R2 și solicită R1. În astfel de cazuri, singura soluție este ca operatorul computerului să înceteze unul dintre joburi, care apoi trebuie repornit. Cu controlul jobului, dacă jobul A este programat să ruleze, jobul B nu va fi pornit până când jobul A nu finalizează sau eliberează resursele necesare.

Caracteristici comune DOS și OS JCL

Locuri de muncă, pași și proceduri

Atât pentru DOS, cât și pentru OS, unitatea de lucru este sarcina . O lucrare constă din unul sau mai mulți pași, fiecare dintre aceștia fiind o cerere pentru a rula un anumit program. De exemplu, înainte de zilele bazelor de date relaționale , o lucrare pentru a produce un raport tipărit pentru management ar putea consta din următorii pași: un program scris de utilizator pentru a selecta înregistrările corespunzătoare și a le copia într-un fișier temporar; sortați fișierul temporar în ordinea necesară, utilizând de obicei un utilitar de uz general; un program scris de utilizator pentru a prezenta informațiile într-un mod ușor de citit de către utilizatorii finali și care include alte informații utile, cum ar fi totalurile secundare; și un program scris de utilizator pentru formatarea paginilor selectate din informațiile utilizatorului final pentru afișare pe un monitor sau terminal.

Atât în ​​DOS, cât și în OS JCL, primul „card” trebuie să fie cardul JOB, care:

  • Identifică postul.
  • De obicei oferă informații pentru a permite departamentului de servicii informatice să factureze departamentul corespunzător pentru utilizatori.
  • Definește modul în care trebuie executat jobul în ansamblu, de ex. Prioritatea acestuia în raport cu alte joburi din coadă.

Procedurile (denumite în mod obișnuit procs ) sunt pre-scrise JCL pentru pași sau grupuri de pași, inserate într-un job. Ambele JCL permit astfel de proceduri. Procs-urile sunt utilizate pentru repetarea etapelor care sunt utilizate de mai multe ori într-un singur job sau în mai multe joburi diferite. Acestea economisesc timp programatorului și reduc riscul de erori. Pentru a rula o procedură, se include pur și simplu în fișierul JCL un singur „card” care copiază procedura dintr-un fișier specificat și îl introduce în fluxul de lucru. De asemenea, procs poate include parametri pentru a personaliza procedura pentru fiecare utilizare.

Sintaxa de bază

Atât DOS, cât și OS JCL au o lungime maximă de linie utilizabilă de 80 de caractere, deoarece atunci când DOS / 360 și OS / 360 au fost utilizate pentru prima dată, metoda principală de a furniza intrări noi unui sistem de computer a fost cartele perforate cu 80 de coloane . Mai târziu a devenit posibilă trimiterea lucrărilor prin fișiere de disc sau bandă cu lungimi mai mari de înregistrare, dar componentele sistemului de operare pentru trimiterea lucrărilor au ignorat totul după caracterul 80.

Strict vorbind, ambele familii de sisteme de operare folosesc doar 71 de caractere pe linie. Caracterele 73-80 sunt de obicei numere de secvență a cardurilor pe care sistemul le-a imprimat în raportul de finalizare a lucrării și sunt utile pentru identificarea locațiilor oricăror erori raportate de sistemul de operare. Caracterul 72 este lăsat de obicei necompletat, dar poate conține un caracter nonblank pentru a indica faptul că instrucțiunea JCL este continuată pe următoarea carte.

Toate comenzile, numele parametrilor și valorile trebuie să fie cu majuscule, cu excepția numelor de fișiere USS .

Toate liniile, cu excepția intrării in-stream (a se vedea mai jos), trebuie să înceapă cu o bară „ / ” și toate liniile pe care sistemul de operare le procesează trebuie să înceapă cu două bare oblice // - începând întotdeauna în prima coloană . Cu toate acestea, există două excepții: declarația delimitator și declarația de comentariu. O declarație de delimitare începe cu o bară și un asterisc ( /* ), iar o declarație de comentariu în OS JCL începe cu o pereche de bare și asterisc ( //* ) sau un asterisc în DOS JCL.

Multe declarații JCL sunt prea lungi pentru a se încadra în 71 de caractere, dar pot fi extinse la un număr nedefinit de cărți de continuare prin:

OS JCL DOS JCL
Încheierea tuturor cărților JCL reale, cu excepția ultimei într-un punct în care sintaxa necesită virgulă ( , ) Încheierea tuturor cărților JCL reale, cu excepția ultimei într-un punct în care sintaxa necesită o virgulă ( , ) și un caracter ne-gol în coloana 72
Începând fiecare carte de continuare cu // coloana 1 și apoi cel puțin 1 spațiu Începând fiecare carte de continuare cu spații și continuând în coloana 15

Structura celor mai comune tipuri de cărți este:

OS JCL DOS JCL
  • //
  • Câmp de nume pentru această afirmație, urmând // fără spațiu între. Dacă această afirmație nu are un nume, urmează imediat cel puțin un gol // .
  • Spațiu (spații)
  • Tipul de declarație
  • Spațiu (spații)
  • Parametrii, care variază în funcție de tipul instrucțiunii, separați prin virgule și fără spațiu între ele.
  • // (spații dacă aceasta este o continuare a unei linii anterioare)
  • Tipul de instrucțiune pentru această instrucțiune, urmând // cu un spațiu între.
  • Spațiu (spații)
  • Numele resursei
  • Spațiu (spații)
  • Parametrii, care variază în funcție de tipul instrucțiunii, separați prin virgule și fără spațiu între ele. Parametrii poziționali, urmate de parametrii cuvintelor cheie.

Intrare in-stream

Ambele DOS și OS JCL permit intrarea in-stream, adică „carduri” care urmează să fie procesate de programul de aplicație, nu de sistemul de operare. Datele care trebuie păstrate mult timp vor fi stocate în mod normal pe disc, dar înainte ca utilizarea terminalelor interactive să devină obișnuită, singura modalitate de a crea și edita astfel de fișiere de disc a fost prin furnizarea noilor date pe carduri.

DOS și OS JCL au modalități diferite de a semnaliza începutul intrării in-stream, dar ambele se termină intrarea in-stream cu /* coloana 1 a cardului după ultima carte de date in-stream. Acest lucru face ca sistemul de operare să reia procesarea JCL în card după /* card.

  • OS JCL: Instrucțiunile DD pot fi utilizate pentru a descrie date in-stream, precum și seturi de date. O declarație DD care se ocupă de date in-stream are un asterisc (*) care urmează identificatorului DD, de ex //SYSIN DD * . Instrucțiunile JCL pot fi incluse ca parte a datelor in-stream folosind instrucțiunile DD DATA.
Un operand numit DLM a permis specificarea unui delimitator (implicit este „/ *”). Specificarea unui delimitator alternativ permite citirea JCL ca date, de exemplu pentru a copia procedurile către un membru al bibliotecii sau pentru a trimite o lucrare cititorului intern .
  • Un exemplu, care trimite o lucrare la Cititorul Intern ( INTRDR ) este:
//SUBM     EXEC PGM=IEBGENER
//SYSPRINT DD   SYSOUT=Z
//SYSUT2   DD   SYSOUT=(A,INTRDR)
//SYSIN    DD   DUMMY
//SYSUT1   DD   DATA,DLM=ZZ
//RUNLATR  JOB  ACCT,MANIX,CLASS=A.TYPRUN=HOLD
//* ^ a JOB to run later
//CPUHOG   EXEC PGM=PICALC1K
//OUTPUT   DD   DSN=PICALC.1000DGTS,SPACE=(TRK,1),DISP=(,KEEP)
ZZ
//* ^ as specified by DLM=ZZ
//DROPOLDR EXEC PGM=IEFBR14
//DELETE4  DD   DSN=PICALC.4DGTS,DISP=(OLD,DELETE)
//DELETE5  DD   DSN=PICALC.5DGTS,DISP=(OLD,DELETE)
  1. Programul numit PICALC1K va aștepta (TYPRUN = HOLD) eliberat manual
  2. Două fișiere, PICALC.4DGTS și PICALC.5DGTS vor fi șterse ACUM.
  • DOS JCL: Pur și simplu introduceți datele in-stream după cardul EXEC pentru program.

Complexitate

O mare parte din complexitatea OS JCL, în special, derivă din numărul mare de opțiuni pentru specificarea informațiilor despre setul de date . În timp ce fișierele din sistemele de operare asemănătoare Unix sunt extrase în colecții arbitrare de octeți, detaliile fiind tratate în mare parte de sistemul de operare, seturile de date de pe OS / 360 și succesorii săi expun tipurile și dimensiunile lor de fișiere, tipurile de înregistrare și lungimile, dimensiunile blocurilor , informații specifice dispozitivului, cum ar fi densitatea benzii magnetice și informații despre etichetă. Deși există valori implicite ale sistemului pentru multe opțiuni, mai sunt multe de specificat de către programator, printr-o combinație de JCL și informații codificate în program. Cu cât sunt mai multe informații codificate în program, cu atât este mai puțin flexibilă, deoarece informațiile din program prevalează de orice din JCL; astfel, cele mai multe informații sunt de obicei furnizate prin JCL.

De exemplu, pentru a copia un fișier pe sistemul de operare Unix , utilizatorul ar introduce o comandă precum:

cp oldFile newFile

Următorul exemplu, folosind JCL, poate fi folosit pentru a copia un fișier pe OS / 360:

//IS198CPY JOB (IS198T30500),'COPY JOB',CLASS=L,MSGCLASS=X
//COPY01   EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD DSN=OLDFILE,DISP=SHR
//SYSUT2   DD DSN=NEWFILE,
//            DISP=(NEW,CATLG,DELETE),
//            SPACE=(CYL,(40,5),RLSE),
//            DCB=(LRECL=115,BLKSIZE=1150)
//SYSIN  DD DUMMY

O a doua explicație pentru complexitatea JCL este așteptările diferite de a rula o lucrare față de cele găsite într-un mediu PC sau Unix.

  • Procesoarele low-end System / 360 au fost mai puțin puternice și mai scumpe decât computerele de la mijlocul anilor 1980 pentru care a fost proiectat MS-DOS. OS / 360 a fost destinat sistemelor cu o dimensiune minimă a memoriei de 32 KB și DOS / 360 pentru sistemele cu minimum 16 KB. Un procesor 360/30 - low-end când System / 360 a fost anunțat în 1964 - a procesat 1,8K până la 34,5K instrucțiuni pe secundă. Primul computer IBM din 1981 avea 16 KB sau 64 KB de memorie și ar procesa aproximativ 330K instrucțiuni pe secundă. Ca urmare, JCL a trebuit să fie ușor de procesat de computer , iar ușurința utilizării de către programatori a fost o prioritate mult mai mică. În această eră, programatorii erau mult mai ieftini decât computerele.
  • JCL a fost conceput pentru procesarea în serie . Ca atare, trebuie să spună totul sistemului de operare, inclusiv ce să facă în funcție de rezultatul unui pas. De exemplu, DISP=(NEW,CATLG,DELETE) înseamnă „dacă programul rulează cu succes, creați un fișier nou și catalogați-l; altfel ștergeți noul fișier”. Programele rulate pe un computer depind frecvent de utilizator pentru a le curăța după probleme de procesare.
  • Mașinile System / 360 au fost proiectate pentru a fi partajate de toți utilizatorii dintr-o organizație. Deci, JOB cardul spune sistemului de operare cum să factureze contul utilizatorului ( IS198T30500 ), ce cantitate predefinită de stocare și alte resurse pot fi alocate ( CLASS=L ) și alte câteva lucruri. //SYSPRINT DD SYSOUT=* spune computerului să imprime raportul programului pe imprimanta implicită care este încărcată cu hârtie obișnuită, nu pe o altă imprimantă care ar putea fi încărcată cu cecuri goale. DISP=SHR spune sistemului de operare că alte programe pot citi OLDFILE în același timp .

Versiunile ulterioare ale sistemelor de operare DOS / 360 și OS / 360 păstrează cele mai multe caracteristici ale JCL original - deși s-au făcut unele simplificări, pentru a evita forțarea clienților să rescrie toate fișierele lor JCL. Mulți utilizatori salvează ca procedură orice set de instrucțiuni JCL care este probabil să fie folosit de mai multe ori sau de două ori.

Sintaxa OS JCL este similară cu sintaxa macro-urilor din limbajul de asamblare System / 360 și, prin urmare, ar fi fost familiară programatorilor într-un moment în care multe programe erau codate în limbaj de asamblare.

DOS JCL

Parametrii poziționali

//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 de citit și scris, dar mai ușor de analizat de către sistem.

  • Programatorul trebuie să-și amintească ce element merge în ce poziție în fiecare tip de declarație.
  • Dacă unii parametri opționali sunt omiși, dar sunt incluși alții ulteriori, parametrii omiși trebuie reprezentați prin virgule fără spații, ca în instrucțiunea TLBL de mai sus.

DOS JCL atenuează într-o oarecare măsură dificultățile parametrilor poziționali utilizând mai multe instrucțiuni cu mai puțini parametri decât OS JCL. În exemplu, instrucțiunile ASSGN, DLBL și EXTENT fac același lucru (specificând unde ar trebui stocat un nou fișier de disc) ca o singură DD instrucțiune în OS JCL.

Dependența dispozitivului

În versiunea originală DOS / 360 și în majoritatea versiunilor de DOS / VS, trebuia specificat numărul modelului dispozitivului care urma să fie folosit pentru fiecare fișier disc sau bandă - chiar și pentru fișierele existente și pentru fișierele temporare care ar fi șterse la sfârșitul sarcinii. Aceasta însemna că, dacă un client a trecut la echipamente mai moderne, multe fișiere JCL trebuiau schimbate.

Ulterior, membrii familiei DOS / 360 au redus numărul de situații în care erau necesare numerele de model ale dispozitivului.

Alocarea manuală a fișierelor

DOS / 360 inițial cerea programatorului să specifice locația și dimensiunea tuturor fișierelor de pe DASD . În EXTENT carte de Specifică volumul la care gradul reședința, pista absolută de pornire, și numărul de piese. Pentru z / VSE un fișier poate avea până la 256 de extensii pe volume diferite.

OS JCL

OS JCL constă din trei tipuri de instrucțiuni de bază:

  • JOB declarație, care identifică începutul lucrării și informații despre întregul job, cum ar fi facturarea, prioritatea de rulare și limitele de timp și spațiu.
  • EXEC declarație, care identifică programul sau procedura care urmează să fie executată în acest pas al lucrării
    și informații despre pas, inclusiv condiții COND pentru rularea sau omiterea unui pas.
  • DD Instrucțiuni (Definiție date), care identifică un fișier de date pentru a fi utilizat într-un pas și informații detaliate despre acel fișier. DD declarațiile pot fi în orice ordine în cadrul pasului.

Încă de la început, JCL pentru familia OS (până la z / OS inclusiv ) a fost mai flexibil și mai ușor de utilizat.

Următoarele exemple utilizează vechiul stil de sintaxă care a fost furnizat chiar de la lansarea System / 360 în 1964. Vechea sintaxă este încă destul de frecventă în joburile care rulează de zeci de ani, cu doar modificări minore.

Reguli pentru codificarea declarațiilor JCL

Fiecare declarație JCL este împărțită în cinci câmpuri:

 Identifier-Field Name-Field Operation-Field Parameter-Field Comments-Field
                 ^          ^               ^               ^
              no space     space          space           space

Identificator-câmp ar trebui să fie concatenat cu nume-câmp , adică nu ar trebui să existe spații între ele.

  • Identifier-Field ( // ): câmpul de identificare indică sistemului că o instrucțiune este mai degrabă o instrucțiune JCL decât o dată. Câmpul de identificare este format din următoarele:
    • Coloanele 1 și 2 ale tuturor instrucțiunilor JCL, cu excepția instrucțiunii delimitator, conțin //
    • Coloanele 1 și 2 din instrucțiunea delimitator conțin /*
    • Coloanele 1, 2 și 3 ale unei declarații de comentarii JCL conțin //*
  • Nume-câmp : câmpul de nume identifică o anumită afirmație, astfel încât alte afirmații și sistemul să poată face referire la aceasta. Pentru instrucțiunile JCL, acesta ar trebui codificat după cum urmează:
    • Numele trebuie să înceapă în coloana 3.
    • Numele este de la 1 la 8 (alfanumerice sau naționale $ , # , @ ) de caractere.
    • Primul caracter trebuie să fie alfabetic.
    • Numele trebuie să fie urmat de cel puțin un gol.
  • Operațiune-câmp : câmpul de operație specifică tipul instrucțiunii sau, pentru instrucțiunea de comandă, comanda. Operațiunea-câmp trebuie codificată după cum urmează:
    • Câmpul de operație este format din caracterele din caseta de sintaxă pentru instrucțiune.
    • Operația urmează câmpul de nume.
    • Operația trebuie să fie precedată și urmată de cel puțin un gol.
    • Operațiunea va fi unul dintre JOB , EXEC și DD .
  • Câmp parametru: câmpul parametru, denumit uneori câmp operand, conține parametri separați prin virgule. Câmpul parametrilor trebuie codificat după cum urmează:
    • Câmpul parametru urmează câmpul operațional.
    • Câmpul parametrului trebuie să fie precedat de cel puțin un gol.
    • Câmpul de parametri conține parametri care sunt cuvinte cheie utilizate în instrucțiune pentru a furniza informații precum numele programului sau al setului de date.
  • Comentarii-câmp : Acesta conține comentarii . Comentariile-câmpul ar trebui să fie codificate după cum urmează:
    • Câmpul de comentarii urmează câmpul parametrului.
    • Câmpul de comentarii trebuie să fie precedat de cel puțin un spațiu liber.

Parametrii cuvintelor cheie

//NEWFILE DD DSN=MYFILE01,UNIT=DISK,SPACE=(TRK,80,10),
//           DCB=(LRECL=100,BLKSIZE=1000),
//           DISP=(NEW,CATLG,DELETE)

Toți parametrii principali ai instrucțiunilor OS JCL sunt identificați prin cuvinte cheie și pot fi prezentați în orice ordine. Câteva dintre acestea conțin doi sau mai mulți sub-parametri, cum ar fi SPACE (cât spațiu pe disc trebuie alocat unui nou fișier) și DCB (specificații detaliate ale aspectului unui fișier) în exemplul de mai sus. Sub-parametrii sunt uneori poziționali, ca în SPACE , dar cei mai complecși parametri, cum ar fi DCB , au sub-parametri de cuvinte cheie.

Parametrul pozițional trebuie să preceadă parametrii cuvântului cheie. Parametrii cuvintelor cheie atribuie întotdeauna valori unui cuvânt cheie folosind semnul egal ( = ).

Acces la date (declarație DD)

DD Declarația este utilizată la datele de referință. Această declarație leagă descrierea internă a unui set de date a unui program de datele de pe dispozitive externe: discuri, benzi, carduri, imprimante etc. DD poate furniza informații precum un tip de dispozitiv (de exemplu, „181”, „2400-5”, „ TAPE '), un număr de serie al volumului pentru benzi sau discuri și descrierea fișierului de date, numit DCB subparametru 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ții despre cardul DD, informații despre eticheta setului de date pentru un fișier existent stocat pe bandă sau disc și macrocomanda DCB codificată în program. La deschiderea fișierului, aceste date sunt îmbinate, informațiile DD primând față de informațiile etichetei, iar informațiile DCB primează asupra ambelor. Descrierea actualizată este apoi scrisă din nou pe eticheta setului de date. Acest lucru poate duce la consecințe neintenționate dacă sunt furnizate informații incorecte DCB.

Datorită parametrilor enumerați mai sus și a informațiilor specifice pentru diferite metode și dispozitive de acces, instrucțiunea DD este cea mai complexă instrucțiune JCL. Într-un manual de referință IBM descrierea declarației DD ocupă peste 130 de pagini - mai mult de două ori mai mult decât declarațiile JOB și EXEC combinate.

Independența dispozitivului

Încă de la început, JCL pentru familia de sisteme de operare a sistemului de operare a oferit un grad ridicat de independență a dispozitivelor. Chiar și pentru fișiere noi , care urmau să fie ținute după sfârșitul lucrării se poate specifica tipul de dispozitiv în termeni generici, de exemplu, UNIT=DISK , UNIT=TAPE sau UNIT=SYSSQ (bandă sau disc). Desigur, dacă ar conta, s-ar putea specifica un număr de model sau chiar o anumită adresă a dispozitivului.

Proceduri

Procedurile permit gruparea uneia sau mai multor instrucțiuni „ EXEC PGM = ” și DD și apoi invocarea lor cu „ EXEC PROC = procname” -sau- pur și simplu „EXEC procname”

O facilitate numită bibliotecă de proceduri a permis proceduri de pre-stocare.

PROC & PEND

Procedurile pot fi, de asemenea, incluse în fluxul de joburi prin încheierea procedurii cu o // PEND instrucțiune, apoi invocarea ei pe nume, la fel ca și cum ar fi î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

Procedurile OS JCL au fost parametrizate de la început, făcându-le mai degrabă ca macrocomenzi sau chiar subrutine simple și crescând astfel reutilizarea lor î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 parametri care vor fi specificați atunci când o lucrare solicită utilizarea procedurii. Declarația PROC, în plus față de denumirea procedurii, permite programatorului să specifice valori implicite pentru fiecare parametru. Deci, s-ar putea folosi procedura din acest exemplu pentru a crea fișiere noi de multe dimensiuni ș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

Recomandări

În lucrările cu mai mulți pași, un pas ulterior poate utiliza o referire în loc să specifice complet 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 la pas MYPR01 ( DSN înseamnă „numele setului de date” și specifică numele fișierului; un DSN nu poate depăși 44 de caractere).

În lucrările care conțin un amestec de JCL-uri specifice și apeluri de procedură, un pas specific job-ului poate face referire la un fișier care a fost complet specificat î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 la pasul MYPR01 procedurii utilizate la pasul STEP01 acestui job”. Utilizarea numelui pasului care a denumit procedura mai degrabă decât denumirea procedurii permite unui programator să utilizeze aceeași procedură de mai multe ori în același job fără confuzie cu privire la instanța procedurii care este utilizată în referback.

Comentarii

Fișierele JCL pot fi lungi și complexe, iar limba nu este ușor de citit. OS JCL permite programatorilor să includă două tipuri de comentarii explicative:

  • Pe aceeași linie ca o declarație JCL. Acestea pot fi extinse prin plasarea unui caracter de continuare (în mod convențional " X ") în coloana 72, urmat de " // " în coloanele 1-3 ale liniei următoare.
  • Liniile care conțin doar comentarii, utilizate adesea pentru a explica puncte majore despre structura generală a JCL, mai degrabă decât detalii locale. Liniile numai pentru comentarii sunt de asemenea utilizate pentru a împărți fișiere JCL lungi și complexe î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

OS JCL permite programatorilor să concateneze („lanț”) fișiere de intrare astfel încât acestea să apară în 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 primele versiuni 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ă inspecteze fiecare instanță și să adauge la declarația DD numită lungimea maximă a blocului găsită, ca în, de exemplu ,

//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 siguranță după OS / MVS R3.7 cu „unitățile selectabile” corespunzătoare) sistemul de operare însuși, în timpul alocării, ar inspecta fiecare instanță într-o concatenare și ar înlocui lungimea maximă a blocului care a fost găsită.

O alternativă obișnuită a fost aceea de a determina pur și simplu lungimea maximă posibilă a blocului pe dispozitiv și de a specifica aceasta pe declarația DD numită, ca în, 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 soluții alternative a fost de a se asigura că metoda de acces va aloca un set de tampoane de intrare suficient de mare pentru a găzdui toate seturile de date specificate.

Prelucrare condiționată

Sistemul de operare se așteaptă ca programele să seteze un cod de returnare care specifică cât de reușit a crezut programul . Cele mai frecvente valori convenționale sunt:

  • 0 = Normal - toate OK
  • 4 = Avertisment - erori minore sau probleme
  • 8 = Eroare - erori sau probleme semnificative
  • 12 = Eroare severă - erori majore sau probleme, rezultatele (de exemplu, fișiere sau rapoarte produse) nu trebuie să fie de încredere.
  • 16 = Eroare terminal - probleme foarte grave, nu utilizați rezultatele!

OS JCL se referă la codul de returnare ca COND („cod de condiție”) și îl poate utiliza pentru a decide dacă se execută pașii următori. Cu toate acestea, spre deosebire de majoritatea limbajelor de programare moderne, pașii condiționați din OS JCL nu sunt executați dacă condiția specificată este adevărată - dând astfel naștere mnemonicului , „Dacă este adevărat, treceți mai departe [fără a rula codul]”. Pentru a complica mai mult lucrurile, condiția poate fi specificată numai după etapa 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:

  1. Rulați STEP01 și colectați codul de returnare.
  2. Nu rulați STEP02 dacă numărul 4 este mai mare decât STEP01 codul de returnare.
  3. Nu rulați STEP03 dacă numărul 8 este mai mic sau egal cu orice cod de returnare anterior.
  4. Rulați STEP04 numai dacă se STEP01 termină anormal.
  5. Fugi STEP05 , chiar dacă STEP03 s-a încheiat anormal.

Aceasta se traduce prin 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

Rețineți că citind pașii care conțin COND declarații înapoi, le puteți înțelege destul de ușor. Acesta este un exemplu de transpunere logică . Cu toate acestea, IBM a introdus ulterior condiția IF în JCL, facilitând astfel codificarea oarecum mai ușor pentru programatori, păstrând în același timp COND parametrul (pentru a evita modificarea JCL-urilor existente în care COND parm este utilizat).

COND Parametrul poate fi , de asemenea , specificat în JOB declarație. În acest caz, sistemul "efectuează aceleași teste de cod de returnare pentru fiecare etapă dintr-o lucrare. Dacă se îndeplinește un test de cod de returnare a instrucțiunii JOB, lucrarea se încheie."

Utilități

Locurile de muncă utilizează un număr de programe utilitare IBM pentru a ajuta la procesarea datelor. Utilitățile sunt cele mai utile în procesarea în serie. Utilitățile pot fi grupate în trei seturi:

  • Utilități set de date - Creați, tipăriți, copiați, mutați și ștergeți seturi de date.
  • Utilități de sistem - Mențineți și gestionați cataloage și alte informații despre sistem.
  • Servicii de metode de acces - Procesează metoda de acces la stocarea virtuală (VSAM) și seturi de date non-VSAM.

Dificultate de utilizare

OS JCL este incontestabil complex și a fost descris ca „ostil pentru utilizator”. Așa cum a întrebat o carte de instrucțiuni despre JCL, „De ce ezită chiar și programatorii sofisticați când vine vorba de Limbajul de control al locurilor de muncă?” Cartea a afirmat că mulți programatori fie au copiat carduri de control fără să înțeleagă cu adevărat ce au făcut, fie „au crezut zvonurile prevalente că JCL este oribil și că doar tipurile de computer„ dur ”au înțeles-o vreodată” și au predat sarcina de a afla Declarații JCL către altcineva. O astfel de atitudine ar putea fi găsită în manualele de limbaj de programare, care au preferat să se concentreze asupra limbajului în sine și nu asupra modului în care au fost rulate programele din acesta. Așa cum a spus un manual Fortran IV atunci când a enumerat posibile mesaje de eroare de la compilatorul WATFOR : „Ați fost atât de prost ca să încercați să vă scrieți propriile carduri de control al sistemului„ DD ”? Încetați și renunțați imediat; fugiți, nu mergeți, pentru ajutor. "

Cu toate acestea, unele cărți care au intrat în JCL în detaliu au subliniat faptul că, odată ce a fost învățată într-un grad cel puțin oarecum competent, s-a obținut libertatea față de valorile implicite la nivel de instalare și un control mult mai bun asupra modului în care un sistem IBM a procesat volumul de lucru. O altă carte a comentat complexitatea, dar a spus: „ia-ți inima. Capacitatea JCL pe care o vei câștiga din [capitolul precedent] este tot ceea ce majoritatea programatorilor vor avea vreodată nevoie”.

Limbă de control al intrării în posturi

Pe sistemele mainframe IBM Job Entry Control Language sau JECL este setul de instrucțiuni de control al limbajului de comandă care furnizează informații pentru subsistemul de spooling - JES2 sau JES3 pe z / OS sau VSE / POWER pentru z / VSE . Declarațiile JECL pot „specifica pe ce computer de rețea să ruleze jobul , când să ruleze jobul și unde să trimită rezultatul rezultat”.

JECL este distinct de limbajul de control al jobului (JCL), care instruiește sistemul de operare cum să ruleze jobul.

Există diferite versiuni ale JECL pentru cele trei medii.

OS / 360

O versiune timpurie a Limbajului de control al intrării joburilor pentru OS / 360 Remote Job Intry (Numărul programului 360S-RC-536) a folosit identificatorul   ..   din coloanele 1-2 din înregistrarea de intrare și a constat dintr-o singură declarație de control: JED (Definiția intrării jobului). „Statie de lucru Comenzi“ , cum ar fi LOGON , LOGOFF și de STATUS asemenea a început cu   ..  .

pre-JES JECL

Deși termenul nu fusese încă dezvoltat, HASP avea o funcționalitate similară cu ceea ce avea să devină JECL al JES , inclusiv /* sintaxa.

z / OS

Pentru instrucțiunile JES2 JECL încep cu /* , pentru JES3 încep cu //* , cu excepția telecomenzii   /*SIGNON   și a   /*SIGNOFF   comenzilor. Comenzile pentru cele două sisteme sunt complet diferite.

JES2 JECL

Următoarele instrucțiuni JES2 JECL sunt utilizate în z / OS 1.2.0.

Declarație JECL Funcţie Exemplu
/*$command Introduce o comandă operator (consolă) /*$S PRINTER3
/*JOBPARM Specifică valori pentru parametrii legați de job /*JOBPARM TIME=10
/*MESSAGE Trimite un mesaj către consola operatorului /*MESSAGE CALL JOE AT HOME IF JOB ABENDS
/*NETACCT Specifică numărul de cont pentru lucrarea de rețea /*NETACCT 12345
/*NOTIFY Specifică destinația pentru mesajele de notificare /*NOTIFY SAM
/*OUTPUT Specifică opțiunile setului de date SYSOUT /*OUTPUT FORMS=BILL
/*PRIORITY Setează prioritatea de selecție a lucrărilor /*PRIORITY 15
/*ROUTE Specifică destinația de ieșire sau nodul de execuție /*ROUTE PRT RMT5
/*SETUP Solicită montarea volumului sau altă operațiune offline /*SETUP TAPE01,TAPE02
/*SIGNOFF Încheie sesiunea la distanță /*SIGNOFF
/*SIGNON Începe sesiunea la distanță /*SIGNON REMOTE5 password
/*XEQ Specifică nodul de execuție /*XEQ DENVER
/*XMIT Indică lucrarea sau setul de date care trebuie transmise către alt nod de rețea /*XMIT NYC

JES3 JECL

Următoarele instrucțiuni JES3 JECL sunt utilizate în z / OS 1.2.0

Declarație JECL Funcţie Exemplu
//**command Introduce o comandă operator JES3 (consolă)
//*DATASET Marcă începutul unui set de date in-stream
//*ENDDATASET Marcă sfârșitul unui set de date in-stream
//*ENDPROCESS Marcă sfârșitul unei serii de   //*PROCESS   afirmații
//*FORMAT Specifică   SYSOUT   opțiunile setului de date
//*MAIN Specifică valori pentru parametrii legați de job
//*NET Identifică relațiile dintre locuri de muncă folosind controlul postului dependent de JES3
//*NETACCT Specifică numărul de cont pentru lucrarea de rețea
//*OPERATOR Trimite un mesaj către consola operatorului
//*PAUSE Oprește cititorul de intrare
//*PROCESS Identifică un loc de muncă non-standard
//*ROUTE Specifică nodul de execuție pentru lucrare
/*SIGNOFF Încheie sesiunea la distanță /*SIGNOFF
/*SIGNON Începe sesiunea la distanță

z / VSE

Pentru instrucțiunile VSE JECL începeți cu * $$ "(notați spațiul unic ). Limba de control a intrării joburilor definește liniile de început și sfârșit ale lucrărilor JCL. Acesta sfătuiește VSE / POWER cum este gestionat acest job. Declarații Jecl definesc numele de locuri de muncă (utilizat de VSE / POWER), clasa în care este procesată de muncă, precum și dispunerea de muncă ( de exemplu D , L , K , H ).

Declarație JECL Funcţie Exemplu
* $$ CTL Stabilește o clasă de intrare implicită * $$ CTL CLASS=A
* $$ JOB Specifică atributele unui job * $$ JOB JNM=PYRL,PRI=9
* $$ EOJ Marcă sfârșitul unui loc de muncă * $$ EOJ
* $$ RDR Inserează un fișier dintr-o dischetă 3540 în fluxul de intrare * $$ RDR SYS005,'fname',2
* $$ PRT Specifică caracteristicile fișierelor de tipărire în spool
„LST 'este un sinonim pentru„ PRT ”
* $$ PRT FNO=STD,COPY=2
* $$ PUN Specifică caracteristicile fișierelor de punch spool * $$ PUN DISP=T,TADDR=280
* $$ SLI Inserează date („carte”) din biblioteca de declarații sursă în fluxul de intrare * $$ SLI A.JCL1
* $$ DATA Inserează date de la cititorul de carduri într-o carte preluată din biblioteca sursă de declarații * $$ DATA INPUT1

Exemplu:

* $$ JOB JNM=NAME,DISP=K,CLASS=2

[some JCL statements here]

* $$ EOJ

Alte sisteme

Alte sisteme de loturi mainframe au avut o anumită formă de limbaj de control al posturilor, indiferent dacă se numește așa sau nu; sintaxa lor era complet diferită de versiunile IBM, dar de obicei ofereau capacități similare. Sistemele interactive includ „ limbaje de comandă ” - fișierele de comandă (cum ar fi fișierele „.bat” PCDOS) pot fi rulate fără interacțiune, dar acestea, de obicei, nu oferă un mediu la fel de robust pentru a rula lucrări nesupravegheate ca JCL. Pe unele sisteme de calcul, limbajul de control al jobului și limbajul de comandă interactiv pot fi diferite. De exemplu, TSO pe sistemele z / OS folosește CLIST sau Rexx ca limbaje de comandă împreună cu JCL pentru lucru în serie. Pe alte sisteme, acestea pot fi aceleași.

Vezi si

Referințe

Surse