Job Control Language
JCL, acronimo Job Control Language, è un linguaggio di scripting utilizzato nei sistemi operativi IBM DOS/VSE, OS/VS1 e MVS per eseguire (in gergo lanciare) una procedura batch in un ambiente tipicamente mainframe.
Il linguaggio utilizza un file ASCII, o, nei vecchi sistemi, un insieme di schede perforate, formato da una sequenza di tre tipi fondamentali di statement (in gergo schede): JOB, EXEC, DD nella sequenza:
JOB
EXEC
DD
...
DD
EXEC
DD
...
DD
Caratteristiche
La prima scheda (JOB), unica nel JCL e prima nella sequenza, assegna un nome alla procedura batch. Con tale nome la procedura è riconosciuta dal sistema operativo ed identificata nei messaggi di inizio e fine lavoro.
La seconda (EXEC), una per ciascun programma, identifica tutti i programmi da eseguire per quella specifica procedura nella loro sequenza di lavorazione.
La terza (DD), una per ciascun dataset, definisce i dataset di input e di output utilizzati dal programma.
Gli statement iniziano sempre con una doppia slash a posizione 1 e 2.
Gli statement con un asterisco in terza posizione sono di commento e non vengono interpretati dal sistema operativo.
Gli statemnet che terminano con una virgola proseguono nella scheda successiva. La continuazione è utilizzata generalmente per le schede DD che devono fornire al sistema operativo numerose informazioni specifiche sui dataset utilizzati: nome del dataset, device di allocazione, formato del record, ecc.
Il JCL termina con uno statement che contiene solo una doppia slash.
Esempio di un semplice JCL
//POPRRIEP JOB
//***************************************************************
//**** XII CENSIMENTO GENERALE DELLA POPOLAZIONE 1 9 8 1
//****----------------------------------------------------------*
//**** PROCEDURA POP14 - ELABORAZIONE REGIONALE FASE RIEPILOGO
//***************************************************************
//POP14RS1 EXEC PGM=SORT,TIME=1440
//STEPLIB DD DSNAME=SYS1.LINKLIB,DISP=SHR
//SORTLIB DD DSNAME=SYS1.SORTLIB,DISP=SHR
//SYSOUT DD SYSOUT=A
//SORTWK01 DD UNIT=3350,DSN=&&ROMA1,DISP=(NEW,DELETE),
// SPACE=(CYL,(270)),VOL=SER=WORK2A
//SORTWK02 DD UNIT=3350,DSN=&&ROMA2,DISP=(NEW,DELETE),
// SPACE=(CYL,(270)),VOL=SER=WORK2A
//SORTWK03 DD UNIT=3350,DSN=&&ROMA3,DISP=(NEW,DELETE),
// SPACE=(CYL,(270)),VOL=SER=WORK2B
//SORTWK04 DD UNIT=3350,DSN=&&ROMA4,DISP=(NEW,DELETE),
// SPACE=(CYL,(270)),VOL=SER=WORK2B
//SORTWK05 DD UNIT=3350,DSN=&&ROMA5,DISP=(NEW,DELETE),
// SPACE=(CYL,(270)),VOL=SER=WORK2C
//SORTWK06 DD UNIT=3350,DSN=&&ROMA6,DISP=(NEW,DELETE),
// SPACE=(CYL,(270)),VOL=SER=WORK2C
//SORTWK07 DD UNIT=3350,DSN=&&ROMA7,DISP=(NEW,DELETE),
// SPACE=(CYL,(270)),VOL=SER=WORK2D
//SORTWK08 DD UNIT=3350,DSN=&&ROMA8,DISP=(NEW,DELETE),
// SPACE=(CYL,(270)),VOL=SER=WORK2D
//SORTIN DD UNIT=3350,DISP=(OLD,KEEP),DSN=COPIA99.ROMA,
// VOL=SER=(RICDK1,RICDK2,RICDK3)
//SORTOUT DD UNIT=(3350,3),DCB=(RECFM=FB,LRECL=130,BLKSIZE=18980),
// SPACE=(CYL,(520,180),RLSE),DISP=(NEW,PASS),
// DSN=POP14RS1.ROMA,VOL=SER=(WORK2E,WORK2F,WORK2G)
//SYSIN DD *
SORT FIELDS=(59,4,A),FORMAT=BI
/*
//POP14110 EXEC PGM=POP14110
//STEPLIB DD DSN=PGM.LOAD,DISP=SHR
//SYSOUT DD SYSOUT=A
//SYSUDUMP DD SYSOUT=A
//SYSDBOUT DD SYSOUT=A
//FILINP DD UNIT=3350,DSN=POP14RS1.ROMA,
// DISP=(OLD,KEEP,KEEP),VOL=SER=(WORK2E,WORK2F,WORK2G)
//ORIEP117 DD UNIT=(3400-6,P),DSN=ORIEP117.ROMA,VOL=SER=09995,
// DCB=(RECFM=FB,LRECL=400,BLKSIZE=8000),DISP=(NEW,KEEP)
//ORIEP10 DD UNIT=(3400-6,P),DSN=ORIEP10.ROMA,VOL=SER=06583,
// DCB=(RECFM=FB,LRECL=400,BLKSIZE=8000),DISP=(NEW,KEEP)
//CHKPOINT DD UNIT=3350,VOL=SER=VS1104,DSN=CHKPOINT.ROMA,
// DISP=(NEW,KEEP),SPACE=(CYL,(20,4),RLSE)
//OSTAMPA DD SYSOUT=A,DCB=(RECFM=FA,BLKSIZE=133)
//