Job Control Language

Fra DDHFwiki
Spring til navigation Spring til søgning

På IBM’s mainframe systemer fra System/360 til nutidens system z/OS bliver programmer startet og afviklet ved brug af JCL, ligesom adgang til eksisterende data og generering af ’nye’ data styres via JCL.

JCL knytter forbindelsen mellem den fysiske verden (maskinen / IO-enhederne) og den logiske verden, som applikationsprogrammet arbejder med.

I princippet behøver programmøren kun at vide meget lidt om i hvilket fysisk miljø programmet skal afvikles; det klares typisk af driftsplanlægningen. Programmet arbejder med logiske data – maskineriet med fysiske data.

Oprindelse

JCL blev oprindeligt skrevet til 80 kolonners hulkort, som så blev indlæst via en hulkortkortlæser (f.eks. IBM 2501) for at starte jobbet. Senere blev JCL’et lagret på disk i et såkaldt ’procedurebibliotek’ og læst ind herfra med ’start-JCL’ – manuelt fra en terminal (f.eks. TSO) eller startet via et automatisk planlægnings- og afviklingssystem (f.eks. OPC).

Selv om de fysiske hulkort er afskaffet arbejdes der fortsat i formatet og i daglig tale hedder det fortsat JCL-kort eller JCL-statements !

Der er langt flere muligheder i JCL’et end vist her. Her skal det blot give en grundlæggende ide om hvad JCL er og hvordan det styrer opgaveafviklingen.

JCL Grundlæggende

JCL består primært af 3 kort-typer:

  • JOB – EXEC - DD
  • JOB: Indleder enhver jobafvikling. Betegnelsen dækker afvikling af eet til flere programmer (kaldet STEP)
  • EXEC: Her kaldes det applikationsprogram som ønskes afviklet. Under et JOB kan der være flere EXEC-kort, for en rækkefølge af programmer der skal afvikles i en fast sekvens f.eks. med aflevering af data fra det ene til det andet. Eksempelvis kunne 1. step være indlæsning og kontrol af data, 2. step en sortering og 3. step udskrivning af de sorterede data.

(Normalt printer man ikke direkte fra et sådan programforløb, da man i givet fald skulle følge printerens hastighed og dermed forlænge køretiden. Udskrivning foretages typisk separat via særlige print programmer.)

Programmet findes i nogle forud definerede programbiblioteker, f.eks. FIRMAPROG(member), hvor member=programnavn. Der ligger altså flere programmer i programbiblioteket, som derfor kaldes et ”partitioned library” – typisk forkortet som PO (Partitioned Organized). Findes programmet ikke her søges der normalt videre i et IBM standard systembibliotek; SYS1.PGMLIB(membernavn), hvor også standard hjælpeprogrammer ligger, f.eks. IEHINITT til initiering af magnetbånd.

Job, step og DD-navne må højst være på 8 karakterer og skal starte alfabetisk.

  • DD (Data Definition)

Som betegnelsen siger, beskriver DD-kortet de data som skal behandles i det pågældende program-step med datasættets navn, medie, status (input/output) samt beskrivelse af fysisk lagring i records, blokke mv. for nye data.

Der kan derfor være et mindre eller større antal DD-kort per EXEC-kort, hvor hvert DD-kort referer til et data-navn brugt i applikationsprogrammet.

JCL Eksempler

Eksempel 1 - et smart hjælpeprogram

//JOB01   JOB Class=B
//STEP1   EXEC PGM=IEFBR14
//DATAIND DD DSN=datasætnavn,DISP=(OLD,DELETE,DELETE)

CLASS= angiver hvilken inputkø, og dermed hvilken initiator jobbet betjenes af. Se evt. med under ”Operativ systemer” om initiatorer og jobafvikling.

I EXEC-kortet kaldes verdens mindste program (Assembler: Branch til reg. 14) der skaber et interrupt, hvorefter systemet udfører DISP-parameteren på, og i dette eksempel slettes det pågældende datasæt hvad enten kørslen lykkes eller fejler (henholdsvis 1. og 2. parameter i DISP-parameteren).

Programmet kunne lige så godt anvendes til at oprette et tomt datasæt, f.eks. afsætte (allokere) plads på en disk til senere brug. Læs senere om krav til oprettelse af disk-datasæt i Eksempel 3.

Eksempel 2 - simpel print af data

For JCL gælder nogle helt faste regler (som for programmeringssprog). F.eks. skal de 3 korttypers betegnelser starte senest i kolonne 12 og sidste kolonner kolonne 71, evt. med et komma i kolonne 72 hvis de pågældende parametre skal fortsætte i det næste kort (næste linje).

//JOB02   JOB Class=A		
//STEP1   EXEC PGM=programnavn
//DATAIND DD DSN=datasætnavn,DISP=OLD	(for katalogiserede data)
//DATAUD  DD SYSOUT=A

Programmet læser data og sender dem ud i systemets SYSOUT-kø – kø klasse A – hvorfra de eventuelt senere kan printes fysisk eller læses fra en terminal.

Katalogiserede data betyder at data er ’kendte’ i systemet og informationer og hvorvidt data befinder sig på tape eller disk hentes fra kataloget.

Eksempel 3 - oprettelse af nye datasæt

//JOB03   JOB Class=A		
//STEP1   EXEC PGM=programnavn
//DATAIND DD DSN=datasætnavn,DISP=OLD
//NYDAT01 DD DSN=nytdatasætnavn1,DISP=(NEW,CATLG),
//        UNIT=TAPE,DCB=(RECFM-FB,LRECL=450,BLKZIZE=45000)
//NYDAT02 DD DSN= nytdatasætnavn2,DISP=(NEW,CATLG),
//        UNIT=DISK,DCB=(RECFM-FB,LRECL=725,BLKZIZE=7250),
//        SPACE=(CYL,(30,2),RLSE)

DATAIND beskriver naturligvis de data der ska læses. Oplysninger hvor input-data befinder sig – på tape eller disk – findes automatisk i et katalog, såfremt datasættet ved sin etablering blev katalogiseret (DISP=NEW,CATLG).

Informationer om data’s opbygning mv. tages f.eks. fra magnetbåndets label eller diskens indholdsfortegnelse (VTOC – Volume Table of Content).

I dette eksempel danner programmet 2 nye datasæt, som i programmet er benævnt som NYDAT01 og NYDAT02, hvorfor der skal være et tilhørende JCL-kort per datasæt/fil.

NYDAT01 skal skrives ud på tape, hvorfor det er NEW og navn og specifikationer skal gemmes i et katalog, så det senere kan hentes alene med kald af datasæt-navnet.

UNIT: Angiver på hvilket medie data skal skrives, f.eks. UNIT=TAPE eller UNIT=DISK. Sidstnævnte kan have andre betegnelser, så visse data styres til bestemte diske (puljer), f.eks. UNIT=DASD (Direct Access Storage Device) eller UNIT=3380 (IBM disktype).

Som nyt datasæt skal den ønskede fysiske opbygning på tapen beskrives i en DCB-parameter (Data Control Block), med record-format (RECFM=FB – Fixed Blocked), LRECL – den logiske record-længde programmet arbejder med, samt BLKSIZE (blokstørrelse – et multiplum af LRECL (når denne er fast-længde). (Records kan også være af variabel længde, et forhold som specielt applikationsprogrammet skal håndtere. LRECL og BLKSIZE angiver her maximum længder.)

NYDAT02 skal gemmes på disk, hvilket ud over de samme krav som til tape kræver reservation af plads (SPACE) der kan rekvireres i cylindre (CYL) og/eller spor (TRK – tracks) efter behov.

I eksemplet rekvireres 20 cylindre med det samme, men hvis der bliver behov for mere plads ønskes det tildelt med 2 cylindre ad gange – op til 15 gange.

RLSE – Release betyder at bliver der brugt færre end de 20 cylindre må de overskydende frigives når jobbet slutter.

Allokeringen er altså fast såfremt man ikke bruger RLSE, hvilket sagtens kan være korrekt, såfremt der ved en senere kørsel skal ’fyldes’ flere data i datasættet.  

Eksempel 4 - flere programstep

//EKS02   JOB Class=B
//*
//STEP1   EXEC PGM=programnavn
//DATAIND DD DSN=datasætnavn,DISP=OLD	
//UDDATA  DD DSN=nytdatasætnavn1,DISP=(NEW,CATLG),
//        UNIT=TAPE,DCB=(RECFM-FB,LRECL=450,BLKZIZE=45000)
//NYT     DD DSN= nytdatasætnavn2,DISP=(NEW,CATLG,DELETE),
//        UNIT=DISK,DCB=(RECFM-FB,LRECL=725,BLKZIZE=7250),
//        SPACE=(CYL,(30,2),RLSE)
//*
//STEP2   EXEC PGM=SORT	(kald af sorteringsprogram)
//*
//SYSOUT  DD SYSOUT=X
//*
//*	KAN BRUGES TIL KOMMENTARER OM STEPPET
//*    SORTERINGSPROGRAMMER KRÆVER ARBEJDSPLADS
//*
//SORTIIN  DD DSN= nytdatasætnavn2,DISP=OLD  (data fra STEP1)
//SORTWK01 DD UNIT=DISK,SPACE=(CYL,(50,2)),DISP=SHR
//SORTWK02 DD UNIT=DISK,SPACE=(CYL,(50,2)),DISP=SHR
//SORTOUT  DD SYSOUT=P,DCB=(RECFM=FB,LRECL=133,BLKSIZE=13300)	
//SYSIN    DD DSN=PARMBIB(sortkritx),DISP=SHR	sorteringskriterier

STEP2 er en standard sortering, der har sine helt faste krav til JCL-kort, som skal have de her angivne navne.

  • SYSPRINT bruges til kontroludskrifter om hvordan sorteringen forløb.
  • SORTIN og SORTOUT beskriver input- og output data
  • SORTWKxx er arbejdsarealer – derfor uden datasæt-navne – men blot med pladsønsker. Jo flere input-data, jo flere SOT`RTWK-arealer.
  • SYSIN henviser til selve sorteringskriterierne, der typisk ligger som member i et partitioneret datasæt. Her beskrives hvilke positioner i recorden der skal sorteres på, feltets længde og om der skal sorteres i stiende eller faldende sekvens.

F.eks. startende i position 3: SORT FIELDS=(20,7,CH,A). Betydende at sorteringsfeltet starter i recordens position 20 og er 7 langt, er et ’character’ felt (kan indeholde både tal og bogstaver) som skal sorteres i stigende rækkefølge (A - ascending sequence)

IBM Standard Utilities

Data skal ofte bearbejdes på en standardiseret måde, så hvorfor opfinde den dybe tallerken hver gang – så IBM leverer et antal standardprogrammer man kan trække på og lade indgå i sine procedurer.

Her nævnes blot nogle få:

  • IEHINITT Til tapeinitiering
  • IEBGENER Til kopiering af data, f.eks. mellem forskellige medier, eller hvor dataopbygning ønskes ændret.
  • SORT Til sortering af data
  • ICEGENER Nyere versioner af ovennævnte
  • ICESORT Nyere versioner af ovennævnte

LÆR MERE OM JCL

Se mere: [1] JCL KURSUS ON-LINE