JOB CONTROL LANGUAGE (JCL)
JCL’nin Temel Kavramları (Adım 1)
JOB CONTROL LANGUAGE (JCL)
JCL’nin Temel Kavramları (Adım 1)
JCL (Job Control Language), IBM mainframe sistemlerinde çalışan işleri (jobs) tanımlamak, yönetmek ve çalıştırmak için kullanılan özel bir betik dilidir. Mainframe dünyasında işler, büyük ölçekli veri işlemleri ve arka plan süreçleri genellikle batch (toplu işlem) olarak çalıştırılır.
Şimdi, JCL’in temel kavramlarını detaylıca ele alalım.
1. Mainframe ve JCL’in Önemi
Öncelikle, mainframe nedir? IBM mainframe sistemleri, özellikle büyük kurumlar, bankalar, sigorta şirketleri ve devlet kurumları tarafından kullanılan güçlü ve güvenilir bilgisayarlardır.
- Yüksek güvenilirlik: Kesintisiz çalışır.
- Büyük veri işleme kapasitesi: Milyonlarca işlemi aynı anda yönetebilir.
- Çoklu kullanıcı desteği: Birden fazla kullanıcının aynı anda işlem yapmasını sağlar.
JCL, mainframe sistemlerinin bu işlemleri yönetmesini sağlar. Örneğin: ✅ Bir banka gün sonunda tüm şubelerinin finansal işlemlerini raporlamak için JCL kullanabilir. ✅ Bir sigorta şirketi, müşteri bilgilerini düzenli olarak yedeklemek için JCL ile otomatik işlemler oluşturabilir. ✅ Bir büyük üretim şirketi, sipariş verilerini işleyerek envanter raporlarını JCL kullanarak oluşturabilir.
2. JCL’in Çalışma Mantığı
JCL, bir işletim sistemine (z/OS gibi) verilen komutlardan oluşur ve iş (job) olarak adlandırılan görevleri yerine getirir.
🔹 Bir JCL betiği, üç temel bileşenden oluşur: 1️⃣ JOB satırı → İşin başlangıcını ve genel ayarlarını belirtir. 2️⃣ EXEC satırı → Çalıştırılacak programı veya komutu belirtir. 3️⃣ DD (Data Definition) satırları → Girdi ve çıktı dosyalarını tanımlar.
Örnek: Basit Bir JCL Betiği
//MYJOB JOB 'SIMPLE JOB',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IEFBR14
//SYSOUT DD SYSOUT=*
🔹 Ne yapar?
✅ JOB satırı işi tanımlar ve sistemin işlemi nasıl yöneteceğini belirler.
✅ EXEC satırı IEFBR14 adlı programı çalıştırır (bu program, gerçek bir işlem yapmaz; genellikle test amaçlı kullanılır).
✅ SYSOUT satırı çıktıyı sistemin yazdırma alanına yönlendirir.
Bu kodu çalıştırdığında, mainframe bu işi alır, ilgili adımı çalıştırır ve çıktıyı üretir.
3. JCL’in Temel Bileşenleri
JCL’de üç ana bileşen vardır. Bunları detaylı inceleyelim.
1️⃣ JOB Satırı — İşin Başlangıcını Tanımlar
Bir işin (job) başlangıcını ve genel ayarlarını belirtir.
- Sistem, bu satırı gördüğünde yeni bir iş başladığını anlar.
- JOB satırında işin adı, kullanıcı bilgileri ve mesaj sınıfları gibi ayarlar bulunur.
🔹 Örnek JOB satırı:
//BANKJOB JOB 'BANK REPORT',MSGCLASS=A,CLASS=A
📌 Açıklama:
- BANKJOB → İşin adı.
- ‘BANK REPORT’ → Açıklama (raporlama işi olduğunu belirtir).
- MSGCLASS=A → Mesaj çıktısının nereye yönlendirileceğini belirtir.
- CLASS=A → İşin çalıştırılma önceliğini belirtir.
2️⃣ EXEC Satırı — Çalıştırılacak Programı Belirtir
Bu satır, hangi programın veya işlemin çalıştırılacağını belirler.
🔹 Örnek EXEC satırı:
//STEP1 EXEC PGM=SORT
📌 Açıklama:
- STEP1 → Adımın adı (her iş, birden fazla adım içerebilir).
- PGM=SORT → SORT adlı programı çalıştırır (verileri sıralamak için kullanılır).
3️⃣ DD (Data Definition) Satırları — Dosyaları Tanımlar
Bu satırlar, JCL’de kullanılan giriş ve çıkış dosyalarını tanımlar.
- Hangi dosyaların kullanılacağını, nasıl açılacağını, nereye yazılacağını belirler.
🔹 Örnek DD satırı:
//SORTIN DD DSN=BANK.DATA.INPUT,DISP=SHR
📌 Açıklama:
- SORTIN → Bu adı taşıyan dosya, SORT programına giriş olarak verilir.
- DSN=BANK.DATA.INPUT → Kullanılacak veri setinin (dataset) adı.
- DISP=SHR → Dosyanın başkaları tarafından da paylaşılabileceğini belirtir.
4. JCL Komutlarının Detaylı Açıklamaları
JCL içerisinde farklı parametreler ve komutlar vardır. Şimdi bunları detaylıca ele alalım.
📌 DISP (Disposal) — Dosyanın Kullanım Modu
DISP parametresi, bir veri setinin nasıl kullanılacağını belirler.
🔹 Örnek Kullanımlar:

DISP DeğeriAçıklamaDISP=NEWYeni bir veri seti oluştur.DISP=SHRDosyayı paylaşım modunda aç.DISP=OLDDosyayı sadece okuma veya yazma için aç.DISP=MODDosyaya veri ekle (append).
📌 SYSOUT — Çıktıyı Yönetme
SYSOUT parametresi, çıktının nereye yönlendirileceğini belirler.
🔹 Örnek:
//SYSOUT DD SYSOUT=A
📌 Açıklama:
- SYSOUT=A → Çıktıyı “A” sınıfı yazdırma kuyruğuna yönlendirir.
📌 SPACE — Disk Alanı Tahsisi
Eğer yeni bir veri seti oluşturuyorsan, ne kadar disk alanı kullanılacağını SPACE parametresiyle belirleyebilirsin.
🔹 Örnek:
//NEWFILE DD DSN=MY.DATASET,DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,1),UNIT=SYSDA
📌 Açıklama:
- SPACE=(CYL,1) → 1 silindirlik alan ayır.
- UNIT=SYSDA → Veri setini standart disk alanına yerleştir.
Sonuç
Şimdiye kadar JCL’nin temel kavramlarını detaylıca ele aldık. Artık şunları biliyorsun: ✅ JCL’in ne olduğu ve nerede kullanıldığı ✅ JOB, EXEC ve DD satırlarının nasıl çalıştığı ✅ Dosya yönetimi ve çıktı yönlendirme komutları ✅ JCL’in temel yapısı ve parametreleri
📌 JCL ile Basit Betikler Yazma ve Çalıştırma (Adım 2)
JCL öğrenmenin en iyi yolu, küçük betikler yazarak ve çalıştırarak pratik yapmaktır. Şimdi, sıfırdan basit bir JCL betiği nasıl yazılır ve çalıştırılır, bunu detaylı ve sade bir şekilde anlatacağım.
1️⃣ JCL Betiği Nedir?
JCL (Job Control Language), IBM mainframe sistemlerinde işleri (jobs) çalıştırmak için kullanılan bir betik dilidir.
- Windows/Linux’ta komut dosyaları (batch, shell script) varsa,
- Mainframe’de JCL vardır.
🔹 JCL Betiği ile Neler Yapabilirsin? ✅ Bir program çalıştırabilir (EXEC PGM=) ✅ Dosya okuyabilir, yazabilir, düzenleyebilir (DD komutları) ✅ İşlem çıktılarını yönlendirebilir (SYSOUT, SYSIN) ✅ Farklı işlemleri belirli kurallarla sıralı şekilde çalıştırabilir
Şimdi, en basit haliyle bir JCL betiği yazalım ve adım adım açıklayalım.
2️⃣ Basit Bir JCL Betiğinin Yapısı
Her JCL betiği üç ana bölümden oluşur:
1️⃣ JOB Satırı → İşin başlangıcını ve yönetim ayarlarını tanımlar. 2️⃣ EXEC Satırı → Çalıştırılacak programı veya işlemi tanımlar. 3️⃣ DD (Data Definition) Satırları → Girdi ve çıktı dosyalarını tanımlar.
🔹 En Basit JCL Betiği Örneği:
//MYJOB JOB 'TEST JOB',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IEFBR14
//SYSOUT DD SYSOUT=*
📌 Bu kod ne yapar?
✅ Bir iş başlatır (MYJOB JOB ...)
✅ Boş bir program çalıştırır (PGM=IEFBR14 – gerçek bir işlem yapmaz)
✅ Çıktıyı sistem yazdırma alanına yönlendirir (SYSOUT=*)
3️⃣ İlk JCL Betiğimizi Yazalım ve Çalıştıralım
Şimdi, gerçek bir işlem yapan bir JCL betiği yazacağız. Bu betik: ✅ Sistem tarihini ve saatini ekrana yazdırır. ✅ Çalıştırma sonucunu bir çıktı dosyasına kaydeder.
📌 JCL Betiği Örneği:
//DATEJOB JOB 'SHOW DATE',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IKJEFT01
//SYSTSPRT DD SYSOUT=*
//SYSIN DD *
TIME
/*
📝 Açıklamalar:
- JOB Satırı (
DATEJOB JOB 'SHOW DATE') - Bu satır işi tanımlar ve çalıştırılmasını sağlar.
'SHOW DATE'açıklama amaçlı bir metindir.MSGCLASS=A, CLASS=A→ İşin mesaj çıktısını ve önceliğini belirler.- EXEC Satırı (
STEP1 EXEC PGM=IKJEFT01) IKJEFT01→ Sistem komutlarını çalıştırmaya yarayan bir programdır.- Burada
TIMEkomutunu çalıştırarak sistemin tarih ve saatini görüntüleyeceğiz. - DD Satırları (
SYSOUT=*,SYSIN DD *) SYSOUT=*→ Çıktıyı ekrana yönlendirir.SYSIN DD *→ Buraya yazılan komutlar (TIME) çalıştırılır.
✅ Çalıştırdığında sistemin tarih ve saati ekrana yazdırılacaktır!
4️⃣ Girdi ve Çıktı ile Çalışmak
Şimdi, bir dosyayı okuyup çıktıyı başka bir dosyaya kaydeden bir JCL betiği yazalım.
📌 Örnek: Bir Dosyayı Okuyup Başka Bir Dosyaya Yazma
//COPYJOB JOB 'COPY FILE',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=MY.INPUT.FILE,DISP=SHR
//SYSUT2 DD DSN=MY.OUTPUT.FILE,DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,1),UNIT=SYSDA
📝 Açıklamalar:
- JOB Satırı (
COPYJOB JOB 'COPY FILE') - İşin başlangıcını belirler.
- EXEC Satırı (
STEP1 EXEC PGM=IEBGENER) IEBGENER→ Bir dosyadan başka bir dosyaya veri kopyalamak için kullanılan bir programdır.- DD Satırları:
SYSUT1→ Girdi dosyasını (MY.INPUT.FILE) belirtir.SYSUT2→ Çıktı dosyasını (MY.OUTPUT.FILE) belirtir.DISP=(NEW,CATLG,DELETE)→ Dosya yeni oluşturulacak, kataloglanacak, başarısız olursa silinecek.
✅ Çalıştırıldığında, MY.INPUT.FILE içeriği MY.OUTPUT.FILE dosyasına kopyalanacaktır.
5️⃣ Birden Fazla İş Adımı (Steps) Kullanmak
Şimdi, aynı JCL betiğinde iki farklı işlem yapalım:
- İlk adımda (
STEP1) bir dosyayı okuyup başka bir dosyaya yazalım. - İkinci adımda (
STEP2) kopyalanan dosyanın içeriğini ekrana yazdıralım.
📌 Örnek: İki Adımlı JCL Betiği
//MULTISTEP JOB 'MULTI STEP JOB',MSGCLASS=A,CLASS=A
//* ADIM 1 - DOSYA KOPYALA
//STEP1 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=MY.INPUT.FILE,DISP=SHR
//SYSUT2 DD DSN=MY.OUTPUT.FILE,DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,1),UNIT=SYSDA
//* ADIM 2 - DOSYAYI EKRANA YAZDIR
//STEP2 EXEC PGM=IEFBR14
//PRINT DD DSN=MY.OUTPUT.FILE,DISP=SHR
//SYSOUT DD SYSOUT=*
✅ Bu JCL betiği, önce dosyayı kopyalar ve sonra içeriğini ekrana yazdırır.
📌 JCL Komutlarını Derinlemesine Öğrenme (Adım 3)
Bu bölümde, JCL’in orta seviyedeki komutlarını detaylı bir şekilde açıklayacağız. Artık temel seviyeyi geçtiğimiz için, JCL’in veri seti yönetimi, iş önceliklendirme ve veri işleme gibi gelişmiş özelliklerine odaklanacağız.
1️⃣ JCL’de DD Parameters (DISP, SPACE, DSN, DCB) Kullanımı
DD (Data Definition) satırları, JCL betiğinde giriş, çıkış ve geçici dosyaları tanımlamak için kullanılır. Bu satırlar, kullanılan veri setleri (datasets) ve sistem kaynakları hakkında bilgi içerir.
DD komutlarının en önemli parametrelerini tek tek inceleyelim:
📌 DISP (Disposal) — Dosyanın Kullanım Modu
🔹 DISP, JCL betiğinde bir veri setinin nasıl açılacağını ve işlem sonunda ne olacağını belirler.
🚀 DISP Kullanım Türleri ve Anlamları

DISP DeğeriAçıklamaDISP=NEWYeni bir veri seti oluşturur.DISP=SHRDosya başkaları tarafından da paylaşılabilir olarak açılır.DISP=OLDDosya yalnızca tek bir iş tarafından kullanılabilir.DISP=MODDosya varsa açılır ve sonuna veri eklenir (append).
🚀 Örnek: Yeni Bir Dosya Oluşturma
//NEWFILE JOB 'CREATE FILE',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IEFBR14
//NEWDD DD DSN=MY.NEW.DATASET,DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,1),UNIT=SYSDA
📌 Bu kod ne yapar?
✅ Yeni bir veri seti oluşturur (DISP=NEW)
✅ Başarıyla tamamlanırsa sistem kataloğuna ekler (CATLG)
✅ İş başarısız olursa dosyayı siler (DELETE)
✅ Veri seti için 1 silindirlik alan tahsis eder (SPACE=(CYL,1))
📌 SPACE (Disk Alanı Tahsisi)
SPACE parametresi, yeni bir veri seti oluştururken ne kadar disk alanı ayrılacağını belirler.
🚀 SPACE Kullanım Türleri ve Anlamları

SPACE DeğeriAçıklamaSPACE=(CYL,1)1 silindirlik alan ayırır.SPACE=(TRK,10)10 track’lik alan ayırır.SPACE=(BLK,20)20 blokluk alan ayırır.
🔹 Örnek: 2 silindirlik veri seti oluşturma
//STEP1 EXEC PGM=IEFBR14
//OUTDD DD DSN=MY.LARGE.DATA,DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,2),UNIT=SYSDA
📌 Bu kod, yeni bir dosya oluşturur ve 2 silindir disk alanı ayırır.
📌 DSN (Data Set Name) — Veri Seti İsmi Belirleme
DSN(Data Set Name) veri setinin ana bilgisayardaki tam adını belirler.- Eğer
DSNparametresi kullanılmazsa, geçici bir veri seti oluşturulur.
🔹 Örnek: Belirli bir veri setini okuma
//READFILE DD DSN=MY.EXISTING.DATA,DISP=SHR
📌 Bu komut, MY.EXISTING.DATA adlı veri setini okuma modunda açar.
📌 DCB (Data Control Block) — Dosyanın Yapısını Tanımlama
DCBparametresi, veri setinin kayıt uzunluğu (LRECL), blok büyüklüğü (BLKSIZE) ve formatını (RECFM) belirler.
🔹 Örnek:
//STEP1 EXEC PGM=MYPROG
//OUTDD DD DSN=MY.DATA,DISP=(NEW,CATLG,DELETE),
// DCB=(LRECL=80,BLKSIZE=800,RECFM=FB)
📌 Bu veri seti için:
✅ Her kayıt 80 karakter uzunluğunda olacak (LRECL=80)
✅ Blok uzunluğu 800 byte olacak (BLKSIZE=800)
✅ Sabit uzunluklu kayıtlar içerecek (RECFM=FB)
2️⃣ Geçici Veri Setleri (Temporary Datasets) Kullanımı
JCL’de kalıcı veya geçici veri setleri oluşturabilirsin.
- Geçici veri setleri,
&&ile başlar ve JCL çalıştırıldığında oluşturulur, iş tamamlandığında otomatik silinir.
🔹 Örnek: Geçici veri seti kullanımı
//STEP1 EXEC PGM=SORT
//SORTIN DD DSN=MY.INPUT.FILE,DISP=SHR
//SORTOUT DD DSN=&&TEMPFILE,DISP=(NEW,DELETE,DELETE)
//SYSOUT DD SYSOUT=*
📌 Ne yapar?
✅ SORTIN, MY.INPUT.FILE adlı veri setinden veri okur.
✅ SORTOUT, geçici bir veri setine yazılır (&&TEMPFILE).
✅ İş bittiğinde &&TEMPFILE otomatik olarak silinir.
3️⃣ SYSOUT ve Spool Yönetimi
🔹 Spool Nedir?
- SPOOL (Simultaneous Peripheral Operations On-line), mainframe’de çıkış dosyalarını geçici olarak saklayan bir alandır.
- SYSOUT parametresi kullanılarak çıkış spool’e yönlendirilir ve gerekirse yazıcıya gönderilir.
🔹 Örnek: Çıkışı yazıcıya yönlendirme
//PRINTOUT DD SYSOUT=A
📌 Bu satır, çıktıyı “A” sınıfı yazdırma kuyruğuna yönlendirir.
4️⃣ JCL ile SORT Kullanımı
SORT programı, veri dosyalarını sıralamak ve filtrelemek için kullanılır.
🔹 Örnek: Bir dosyadaki kayıtları sıralama
//SORTSTEP EXEC PGM=SORT
//SORTIN DD DSN=MY.INPUT.DATA,DISP=SHR
//SORTOUT DD DSN=MY.OUTPUT.DATA,DISP=(NEW,CATLG,DELETE)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(1,10,CH,A)
/*
📌 Bu ne yapar?
✅ İlk 10 karaktere göre sıralama yapar (SORT FIELDS=(1,10,CH,A))
✅ Çıktıyı MY.OUTPUT.DATA dosyasına kaydeder
5️⃣ İşlerin Önceliklendirilmesi (CLASS, PRIORITY)
CLASS→ İşin hangi sınıfta çalışacağını belirler.PRTY→ Öncelik değeri belirler (sadece JES2 kullanılıyorsa).
🔹 Örnek: Öncelikli iş çalıştırma
//HIGHPRIO JOB 'HIGH PRIORITY JOB',CLASS=A,PRTY=10
📌 Bu iş, en yüksek öncelikte çalışacaktır.
Sonuç
Bu adımda JCL’in orta seviye komutlarını derinlemesine öğrendin:
✅ Veri setleri ve dosya yönetimi (DISP, SPACE, DSN, DCB)
✅ Geçici veri setleri oluşturma (&&TEMPFILE)
✅ Çıkışları yönlendirme (SYSOUT) ve spool yönetimi
✅ SORT ile veri işleme
✅ İş önceliklendirme (CLASS, PRTY)
📌 JES2 Nedir?
JES2 (Job Entry Subsystem 2), IBM z/OS işletim sisteminde çalışan bir iş yönetim sistemidir. JCL ile yazılmış işleri çalıştırmak, sıralamak ve çıktıları yönetmek için kullanılır.
1️⃣ JES2’nin Görevi ve Çalışma Mantığı
IBM mainframe sistemlerinde JCL betikleri doğrudan çalıştırılmaz. Bunun yerine, JES (Job Entry Subsystem) tarafından sıraya alınır, işlenir ve sonuçları yönlendirilir.
JES’in iki ana versiyonu vardır:
- JES2 (Job Entry Subsystem 2) — Küçük ve orta ölçekli sistemler için yaygın olarak kullanılır.
- JES3 (Job Entry Subsystem 3) — Daha büyük sistemlerde iş yüklerini merkezi olarak yöneten bir versiyondur.
📌 Özetle:
- JES2, işleri kabul eder, sıralar, çalıştırır ve çıktılarını yönetir.
- JCL betiklerinin çalışmasını sağlayan ana bileşendir.
- Bir iş tamamlandıktan sonra, JES2 çıktıları yazıcıya, ekran görüntüsüne veya dosyaya yönlendirir.
2️⃣ JES2’nin Temel İşlevleri
JES2, bir mainframe sisteminde iş akışını yönetmek için dört temel görev yapar:

GörevAçıklama1️⃣ İş Kabulü (Job Input)JCL betiklerini alır ve iş kuyruğuna ekler.2️⃣ İş Sıralama (Job Scheduling)İşleri öncelik, sınıf ve kaynak durumuna göre sıralar.3️⃣ İş Yürütme (Job Execution)İşletim sistemine işi başlatması için komut gönderir.4️⃣ Çıktı Yönetimi (Job Output Processing)İşin çıktısını spool alanına kaydeder ve gerektiğinde yazıcıya veya dosyaya yönlendirir.
3️⃣ JES2’nin JCL ile Kullanımı
JES2’nin nasıl çalıştığını anlamak için bazı JCL komutlarıyla JES2’ye nasıl emirler verildiğini inceleyelim.
📌 İşin JES2’ye Gönderilmesi
Her JCL betiği JES2’ye bir iş (job) olarak gönderilir.
🔹 Örnek:
//MYJOB JOB 'TEST JOB',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IEFBR14
//SYSOUT DD SYSOUT=*
📌 JES2 burada ne yapar?
✅ MYJOB işini kabul eder ve iş kuyruğuna ekler.
✅ STEP1 adıyla JCL’in ilk adımını yürütmeye hazırlar.
✅ SYSOUT=* komutu ile çıktıyı varsayılan yazdırma kuyruğuna yönlendirir.
📌 JES2’de İş Sınıfları ve Öncelik Ayarları
JES2, işleri belirli sınıflara (CLASS) ve öncelik seviyelerine (PRTY) göre çalıştırır.
🔹 Örnek: Yüksek öncelikli iş çalıştırma
//HIGHJOB JOB 'HIGH PRIORITY JOB',CLASS=A,PRTY=10
📌 Bu ne yapar?
✅ CLASS=A → Bu iş A sınıfındaki işler arasında çalıştırılacaktır.
✅ PRTY=10 → En yüksek önceliğe sahip olduğu için diğer işlerden önce çalıştırılacaktır.
4️⃣ JES2’nin Spool Yönetimi
JES2, çalıştırılan işlerin çıktılarını geçici bir alanda (SPOOL — Simultaneous Peripheral Operations On-line) saklar.
- Çıktılar hemen yazdırılmaz, önce JES2 tarafından bekletilir.
- Kullanıcı, istediği zaman çıktılarını görüntüleyebilir veya yazıcıya gönderebilir.
🔹 Örnek: Çıktıyı JES2 spooling alanına kaydetme
//PRINTJOB JOB 'PRINT OUTPUT',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IEFBR14
//SYSOUT DD SYSOUT=A
📌 Ne olur?
✅ SYSOUT=A, çıktıyı JES2’nin A sınıfı spool alanına yönlendirir.
✅ Kullanıcı, JES2 komutlarıyla bu çıktıyı görüntüleyebilir veya yazıcıya gönderebilir.
5️⃣ JES2 Komutları ile İş Yönetimi
IBM mainframe sistemlerinde JES2 üzerinde çalışan işleri yönetmek için bazı temel operatör komutları vardır.

JES2 KomutuAçıklama$DAJES2 iş kuyruğundaki işleri listeler.$HASPJES2’de çalışan işlerin durumunu gösterir.$SJ12341234 numaralı işi görüntüler.$C12341234 numaralı işi iptal eder.$OQ,ASınıf A’daki tüm çıktıları yazdırır.
🔹 Örnek: JES2’de Çalışan İşleri Görüntüleme
$DA
📌 Bu komut JES2’de sıraya alınmış işleri listeler.
6️⃣ JES2 ve JES3 Arasındaki Farklar
JES2 ve JES3, her ikisi de IBM mainframe sistemlerinde işleri yöneten alt sistemlerdir. Ancak bazı farklar vardır:

ÖzellikJES2 JES3 İş YönetimiHer iş bağımsız yönetilir.İşler merkezi olarak yönetilir.Kaynak YönetimiHer adım için kaynaklar ayrı tahsis edilir.İşin tüm adımları için kaynaklar baştan planlanır.Genellikle Kullanıldığı YerKüçük ve orta ölçekli sistemler.Büyük ölçekli sistemler.
7️⃣ Sonuç: JES2 Neden Önemlidir?
📌 Özetle, JES2’nin rolü şunlardır: ✅ JCL işleri alır ve işler. ✅ İşleri sıraya koyar ve öncelik sırasına göre çalıştırır. ✅ Çıktıları spool alanında saklar ve gerektiğinde yönlendirir. ✅ JES2 komutlarıyla işlerin yönetilmesine olanak tanır.
📌 JCL ile Gelişmiş İş Akışları Oluşturma (Adım 4)
Bu aşamada, JCL’in daha gelişmiş özelliklerini kullanarak iş akışlarını daha dinamik, esnek ve hatalara karşı dayanıklı hale getirmeyi öğreneceğiz.
Bu bölümde şunları detaylı olarak öğreneceğiz: ✅ Koşullu yürütme (COND, RETURN CODES) ✅ IF/THEN/ELSE yapıları ile koşullu adım çalıştırma ✅ Restart & Checkpoint mekanizması ✅ JCL prosedürleri (PROC) ile kod tekrarını azaltma ✅ Symbolic Parameters ile dinamik JCL yazımı
1️⃣ Condition Codes & RETURN CODES (Koşullu Yürütme ve Geri Dönüş Kodları)
JCL’de her adımın çalıştırılma durumu bir “return code” (RC) ile belirlenir.
- Başarıyla tamamlanan adımlar genellikle
RC=0döndürür. - Hata durumları için farklı kodlar döner (
RC=4,RC=8,RC=12,RC=16gibi).
🔹 JCL’de en yaygın RETURN CODE değerleri:

JCL’de bir adımın çalıştırılıp çalıştırılmayacağını **COND (Condition) parametresi** ile kontrol edebiliriz.
📌 Koşullu Çalıştırma (COND) Kullanımı
COND parametresi bir önceki adımdan dönen return code’a göre sonraki adımı çalıştırır veya atlar.
🔹 Örnek: Eğer STEP1 RC=0 döndürmezse (RC=0,NE), STEP2 çalıştırılmaz.
//CHECKJOB JOB 'ERROR CHECK',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=MYPROG
//STEP2 EXEC PGM=BACKUP,COND=(0,NE,STEP1)
📌 Bu ne yapar?
✅ STEP1 çalışır ve return code üretir.
✅ STEP1 eğer **RC=0 üretmezse, STEP2 atlanır.**
✅ Eğer STEP1 başarıyla tamamlanırsa, STEP2 çalıştırılır.
📌 Birden Fazla Şarta Bağlı Çalıştırma
Birden fazla koşul ekleyebilirsin.
🔹 Örnek: Eğer **STEP1 RC=8 veya daha büyük bir değer döndürürse**, STEP2 çalışmaz.
//STEP2 EXEC PGM=BACKUP,COND=(8,LE,STEP1)
📌 Ne yapar?
✅ STEP1 RC=8 veya daha büyükse, STEP2 çalıştırılmaz.
✅ STEP1 RC=4 döndürürse, STEP2 çalışır.
2️⃣ IF/THEN/ELSE Yapıları ile Koşullu Çalıştırma
JCL’de IF/THEN/ELSE yapısı, daha esnek koşullu yürütme sağlar.
🔹 Örnek: Eğer STEP1 hata verirse (RC>=8), ERRORSTEP çalıştırılır.
//CHECKJOB JOB 'ERROR CHECK',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=MYPROG
// IF (STEP1.RC GE 8) THEN
//ERRORSTEP EXEC PGM=ERRHANDLER
// ENDIF
📌 Bu ne yapar?
✅ STEP1 hata verirse (RC>=8), ERRORSTEP çalışır.
✅ Eğer STEP1 başarılıysa, ERRORSTEP atlanır.
3️⃣ Restart & Checkpoint Mekanizması
JCL’de işlerin kaldığı yerden devam etmesini sağlamak için “restart” mekanizması kullanılır. Bunu JES2’ye restart komutu vererek yaparız.
🔹 Örnek: STEP2’den itibaren yeniden başlatma
$ S JOB1234,RESTART=STEP2
📌 Ne olur?
✅ STEP1 çalıştırılmaz, iş STEP2’den itibaren başlar.
🔹 JCL içinde Restart noktası belirleme:
//STEP1 EXEC PGM=MYPROG,CHKPT=YES
📌 Bu JCL kodu, işlemi belli bir noktada bırakıp devam ettirmek için bir “checkpoint” oluşturur.
4️⃣ JCL Prosedürleri (PROC) Kullanımı
JCL prosedürleri (PROC), aynı kodu tekrar tekrar yazmak yerine, tekrar kullanılabilir kod blokları oluşturmaya yarar.
📌 Örnek: Basit Bir JCL Prosedürü (PROC)
//MYPROC PROC
//STEP1 EXEC PGM=SORT
//SORTIN DD DSN=&INFILE,DISP=SHR
//SORTOUT DD DSN=&OUTFILE,DISP=(NEW,CATLG,DELETE)
// PEND
📌 Bu ne yapar?
✅ PROC şablon olarak tanımlanır.
✅ &INFILE ve &OUTFILE dinamik parametrelerdir.
🔹 Bu prosedürü bir JCL içinde çağırma:jcl
//MYJOB JOB 'PROC EXAMPLE',MSGCLASS=A,CLASS=A
//STEP1 EXEC MYPROC,INFILE=MY.INPUT.FILE,OUTFILE=MY.OUTPUT.FILE
📌 Bu, MYPROC prosedürünü MY.INPUT.FILE ve MY.OUTPUT.FILE parametreleriyle çağırır.
5️⃣ Symbolic Parameters ile Dinamik JCL Yazımı
Symbolic Parameters (sembolik parametreler) dinamik JCL yazmayı sağlar.
🔹 Örnek: Sembolik değişken kullanımı
//SORTJOB JOB 'SYMBOLIC PARAM',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=SORT
//SORTIN DD DSN=&INDATA,DISP=SHR
//SORTOUT DD DSN=&OUTDATA,DISP=(NEW,CATLG,DELETE)
// SET INDATA=MY.INPUT.FILE
// SET OUTDATA=MY.OUTPUT.FILE
📌 Bu ne yapar?
✅ **&INDATA → MY.INPUT.FILE olarak değişir.
✅ `&OUTDATA→MY.OUTPUT.FILE` olarak değişir.
✅ Böylece JCL’i değiştirmeden farklı dosyalarla çalıştırabilirsin.**
🔹 Özet: Gelişmiş JCL İş Akışları
Bu adımda şunları öğrendik:
✅ Koşullu yürütme (COND ve RETURN CODE’lar)
✅ **IF/THEN/ELSE ile program akışını kontrol etme
✅ Restart & Checkpoint mekanizması ile işin belirli bir adımından başlatılması
✅ JCL prosedürleri (PROC) ile kod tekrarını azaltma
✅ Symbolic Parameters ile dinamik JCL yazımı**
$ S JOB1234,RESTART=STEP2 Satırındaki $ S Ne Anlama Geliyor?
Bu bir JES2 operatör komutudur ve IBM mainframe sistemlerinde kullanılır.

📌 Özetle: $ S JOB1234,RESTART=STEP2 komutu **JOB1234 adlı işi yeniden başlatır ve doğrudan STEP2’den başlatır, STEP1 atlanır.**
💡 Peki, Restart nasıl çalışır?
- Eğer JCL bir hata nedeniyle durursa, işi en baştan çalıştırmak yerine, belirli bir adımdan yeniden başlatmak için restart komutu verilir.
- JES2, bu komutu alır ve işin belirtilen adımdan başlamasını sağlar.
- Eğer işin
STEP1kısmı başarılı şekilde tamamlandıysa,STEP2’den itibaren çalıştırılabilir.
2️⃣ CHKPT=YES Kullanımı ve Restart ile Bağlantısı
🔹 Bu iki şeyin birbiriyle doğrudan bir bağlantısı yoktur.
CHKPT=YES, bir programın belirli bir noktada "checkpoint" (kontrol noktası) oluşturmasını sağlar.RESTART=STEP2ise, JCL’in belirli bir adımdan tekrar başlamasını sağlar.
📌 Peki, CHKPT=YES ne yapar?
Bir program uzun süre çalışıyorsa ve aniden sistem çökerse, her şeyi en baştan başlatmak yerine, belirli bir "checkpoint"’ten devam etmek daha verimli olur.
CHKPT=YES, programın çalışırken belirli aralıklarla bir "checkpoint" kaydetmesini sağlar.- Eğer sistem çöküp yeniden başlatılırsa, program son checkpoint’ten itibaren çalışmaya devam eder.
🔹 Örnek Kullanım:
//STEP1 EXEC PGM=MYPROG,CHKPT=YES
📌 Ne yapar?
✅ MYPROG programı belirli noktada durur ve o ana kadar yaptığı işlemleri saklar.
✅ Eğer işlem başarısız olursa, program son "checkpoint"’ten itibaren devam edebilir.
🔹 Peki, CHKPT=YES ile Restart aynı mı?
Hayır, farklıdır:
CHKPT=YES, program içinde belirli aralıklarla durma noktası ekler.RESTART=STEP2, JCL’in belirli bir adımdan başlamasını sağlar.
💡 Özetle: CHKPT=YES bir programın içindeki veri işlemesini güvenli hale getirirken, RESTART=STEP2 JCL’in belirli bir adımdan başlamasını sağlar.
📌 JCL ile Gelişmiş İş Akışları — Devam (Adım 5)
Şimdiye kadar koşullu yürütme (COND, IF/THEN/ELSE), restart mekanizması ve sembolik parametreler gibi konulara odaklandık. Bu bölümde JCL iş akışlarını daha dinamik ve verimli hale getirmek için aşağıdaki konulara detaylıca bakacağız:
✅ JCL içinde döngü yapıları ve tekrarlanan işlemler ✅ Multiple Jobs (Aynı anda birden fazla işi çalıştırma) ✅ JCL Debugging — Hata ayıklama yöntemleri ✅ JCL Performance Tuning — Verimli çalıştırma ipuçları
1️⃣ JCL İçinde Döngü (Loop) Yapıları ve Tekrarlanan İşlemler
JCL bir programlama dili değildir ancak tekrarlanan işlemleri verimli şekilde yönetmek için bazı teknikler kullanabiliriz.
📌 JCL’de Döngü Mantığı Nasıl Çalışır?
JCL’in kendisinde bir “for” veya “while” döngüsü yoktur, ancak PROC’lar (prosedürler) ve farklı input dosyaları kullanarak bir işin belirli bir mantık çerçevesinde tekrarlanmasını sağlayabiliriz.
Örnek: Aynı JCL betiğini farklı dosyalarla tekrar tekrar çalıştırmak
//STEP1 EXEC PROC=MYPROC,INFILE=DATA1,OUTFILE=OUTPUT1
//STEP2 EXEC PROC=MYPROC,INFILE=DATA2,OUTFILE=OUTPUT2
//STEP3 EXEC PROC=MYPROC,INFILE=DATA3,OUTFILE=OUTPUT3
📌 Burada ne oluyor?
- Her adım (
STEP1,STEP2,STEP3) aynı prosedürü (MYPROC) çağırıyor. - Ama her seferinde farklı giriş ve çıkış dosyaları kullanılıyor.
- Böylece aynı işlemi tekrar tekrar çalıştırabiliyoruz.
🔹 Bu yöntem özellikle: ✅ Günlük raporlama işlemlerinde (farklı tarihler için aynı rapor oluşturuluyorsa) ✅ Farklı veri kümeleri için aynı işlemi uygulamak gerektiğinde ✅ Toplu veri işleme (batch processing) sistemlerinde kullanılır.
2️⃣ Multiple Jobs — Aynı Anda Birden Fazla İş Çalıştırma
Mainframe sistemlerinde aynı anda birden fazla işi paralel çalıştırabilirsin.
🔹 Örnek: Paralel Çalıştırma
//JOB1 JOB 'PARALLEL JOB 1',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=MYPROG1
//JOB2 JOB 'PARALLEL JOB 2',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=MYPROG2
📌 Burada ne oluyor?
✅ JOB1 ve JOB2 aynı anda çalıştırılabilir.
✅ Her ikisi de farklı kaynakları kullanıyorsa, JES2 veya JES3 tarafından eşzamanlı çalıştırılabilirler.
💡 Bu yöntem ne zaman kullanılır?
- Birçok veri kümesini aynı anda işlemek istediğimizde
- Sistem kaynaklarını daha verimli kullanmak için
- Acil raporlama ve batch işlemleri paralel çalıştırmak gerektiğinde
3️⃣ JCL Debugging — Hata Ayıklama Yöntemleri
JCL betikleri yanlış yazıldığında ya da çalışırken hata verdiğinde, hata kodlarını okumak ve anlamak gerekir.
JCL hata kodlarını anlamak için en önemli üç çıktı dosyası şunlardır: 🔹 JESMSGLG (Job Entry Subsystem Message Log) → JES2 veya JES3’ten gelen sistem mesajları. 🔹 JESYSMSG (Job Entry Subsystem System Messages) → Çalışan işin sistem mesajları ve hata kodları. 🔹 SYSOUT veya SYSABEND → Programın çalışırken ürettiği çıktılar ve hata detayları.
📌 En Yaygın JCL Hata Kodları ve Çözümleri

🔹 Örnek: SYSOUT kullanarak hataları analiz etme
//SYSOUT DD SYSOUT=*
//SYSABEND DD SYSOUT=*
📌 Bu, hata oluştuğunda detaylı hata mesajlarını görüntüler.
4️⃣ JCL Performance Tuning — Verimli Çalıştırma İpuçları
JCL betiklerini daha hızlı ve verimli çalıştırmak için bazı teknikler vardır.
📌 1. TIME Parametresi Kullanımı
Süreyi sınırlandırarak kaynakları daha verimli kullanabilirsin.
//STEP1 EXEC PGM=MYPROG,TIME=30
📌 Bu adımın en fazla 30 saniye çalışmasına izin verilir.
📌 2. GEREKSİZ ADIMLARI ÇALIŞTIRMAMAK
Bütün adımları çalıştırmak yerine, sadece gerçekten ihtiyaç duyulanları çalıştırmak için COND veya IF kullanabilirsin.
🔹 Örnek: Eğer önceki adım hata verdiyse, sonraki adımı atla.
//STEP1 EXEC PGM=MYPROG
//STEP2 EXEC PGM=BACKUP,COND=(0,NE,STEP1)
📌 Eğer STEP1 başarılı olmazsa, STEP2 çalıştırılmaz.
📌 3. BLOCKSIZE Optimizasyonu
Büyük veri işleme yaparken block size değerini optimize etmek performansı artırabilir.
//OUTDD DD DSN=MYDATA,DISP=(NEW,CATLG,DELETE),
// DCB=(BLKSIZE=32760)
📌 Büyük blok kullanmak disk okuma/yazma hızını artırabilir.
📌 SONUÇ: Gelişmiş JCL İş Akışlarının Gücünü Kullan!
✅ JCL içinde döngü mantığını anlamış olduk. ✅ Aynı anda birden fazla işi (parallel jobs) çalıştırmayı öğrendik. ✅ JCL hata kodlarını nasıl okuyacağımızı ve debugging yapacağımızı gördük. ✅ JCL performansını artırmak için optimizasyon tekniklerini öğrendik.
📌 JCL ile DB2 ve VSAM Üzerinde Çalışma (Adım 6)
Bu bölümde, JCL’in veritabanı yönetim sistemleriyle (DB2) ve büyük veri yapılarıyla (VSAM) nasıl çalıştığını öğreneceğiz. JCL’in yalnızca programları çalıştırmak için kullanılan bir betik dili olmadığını, aynı zamanda veritabanlarıyla ve büyük veri kümeleriyle etkileşime girebildiğini göreceğiz.
📌 1. JCL ile DB2 Bağlantısı (IKJEFT01 ve DSN Komutları)
IBM DB2, ana bilgisayarlar (mainframe) için geliştirilmiş ilişkisel veritabanı yönetim sistemidir.
- DB2’ye bağlanarak SQL sorguları çalıştırmak için JCL kullanabiliriz.
- Bunu yapmak için IKJEFT01 adlı programı çalıştırırız.
🔹 IKJEFT01 Nedir?
- “TSO Terminal Monitor Program” olarak da bilinir.
- DB2’ye bağlanıp SQL çalıştırmak için kullanılır.
📌 Örnek: JCL ile DB2 Üzerinde SQL Sorgusu Çalıştırma
Senaryo: Bir müşteri tablosundaki tüm kayıtları listeleyelim.
//DB2JOB JOB 'RUN DB2 QUERY',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IKJEFT01
//SYSTSPRT DD SYSOUT=*
//SYSIN DD *
DSN SYSTEM(DB2P)
RUN PROGRAM(SELECT * FROM CUSTOMER)
/*
📌 Bu JCL betiği ne yapar?
✅ IKJEFT01 programını çalıştırarak DB2’ye bağlanır.
✅ DSN SYSTEM(DB2P) komutu, DB2P adlı veritabanı sistemine bağlanır.
✅ RUN PROGRAM(SELECT * FROM CUSTOMER) komutu, Müşteri tablosundaki tüm kayıtları listeler.
✅ SYSTSPRT DD SYSOUT=* çıktıyı JES2 spool alanına yönlendirir.
📌 Örnek: Bir DB2 Tablosuna Veri Ekleme
Bir tabloya yeni bir müşteri eklemek için INSERT INTO sorgusunu çalıştıralım.
//DB2INSERT JOB 'INSERT INTO TABLE',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IKJEFT01
//SYSTSPRT DD SYSOUT=*
//SYSIN DD *
DSN SYSTEM(DB2P)
RUN PROGRAM(INSERT INTO CUSTOMER (ID, NAME, BALANCE) VALUES (1001, 'ALİ KAYA', 5000))
/*
📌 Bu kod ne yapar?
✅ CUSTOMER tablosuna yeni bir müşteri ekler.
✅ ID = 1001, NAME = ALİ KAYA, BALANCE = 5000 olarak belirlenir.
✅ Sonuçlar SYSOUT'a yönlendirilir.
💡 Not:
- DB2 ile çalışırken SQL sorgularının büyük harfle yazılması tavsiye edilir.
- JCL içinde SQL komutları çalıştırırken hataları kontrol etmek için SYSTSPRT kullanılabilir.
📌 2. VSAM (Virtual Storage Access Method) Yapıları
IBM VSAM (Virtual Storage Access Method), ana bilgisayarlarda büyük verileri yönetmek için kullanılan bir veri depolama sistemidir.
- VSAM, geleneksel veri setlerinden farklı olarak daha hızlı erişim ve indeksleme sunar.
- DB2 gibi ilişkisel bir veritabanı değildir ama ana bilgisayarlarda büyük veri yönetiminde yaygın olarak kullanılır.
🔹 VSAM’in Kullanım Alanları: ✅ Banka hesapları, müşteri verileri gibi büyük ölçekli veri depolama sistemlerinde ✅ Yüksek performanslı indeksli erişime ihtiyaç duyulan yerlerde ✅ Günlük işlem kayıtlarının saklandığı dosya sistemlerinde
📌 VSAM Veri Seti Oluşturma
Bir VSAM veri seti oluşturmak için IDCAMS programını kullanırız.
🔹 Örnek: VSAM Dosya Tanımlama (DEFINE CLUSTER)
//VSAMDEF JOB 'DEFINE VSAM',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE CLUSTER(NAME(MY.VSAM.FILE) -
INDEXED -
KEYS(10,0) -
RECORDSIZE(100 300) -
TRACKS(5 10) -
SHR(3,3))
/*
📌 Bu ne yapar?
✅ MY.VSAM.FILE adında bir VSAM veri seti oluşturur.
✅ INDEXED → Verilere indeksli erişim sağlar.
✅ KEYS(10,0) → Anahtar uzunluğu 10 bayt olarak belirlenmiştir.
✅ RECORDSIZE(100 300) → Kayıt uzunluğu minimum 100, maksimum 300 bayttır.
✅ TRACKS(5 10) → 5 ana track ve 10 ek track ayırır.
💡 Not: VSAM dosyaları, geleneksel düz metin veri setlerinden farklı olarak indeksleme sağlar ve çok büyük veri kümelerinde çok daha hızlı çalışır.
📌 VSAM Dosyası İçine Veri Yazma
🔹 Örnek: VSAM Dosyasına Veri Ekleme
//VSAMWRITE JOB 'WRITE TO VSAM',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
REPRO INFILE(INPUTDD) OUTFILE(VSAMDD)
/*
//INPUTDD DD DSN=MY.INPUT.FILE,DISP=SHR
//VSAMDD DD DSN=MY.VSAM.FILE,DISP=SHR
📌 Bu ne yapar?
✅ MY.INPUT.FILE içindeki verileri MY.VSAM.FILE adlı VSAM veri setine yazar.
✅ REPRO komutu, geleneksel dosyalardan VSAM’a veri kopyalamak için kullanılır.
💡 Not: VSAM dosyalarına direkt olarak bir editörle veri eklenemez. Veriler ya REPRO ile ya da COBOL, PL/I gibi dillerde yazılmış programlarla eklenir.
📌 3. GDG (Generation Data Groups) Kullanımı
GDG (Generation Data Groups), JCL içinde otomatik olarak yeni dosya nesilleri oluşturmayı sağlayan bir sistemdir.
- Özellikle günlük yedekleme sistemlerinde kullanılır.
- Önceki nesiller (
G0001V00,G0002V00gibi) korunabilir ve gerektiğinde geri çağrılabilir.
📌 GDG Kullanarak Otomatik Dosya Oluşturma
🔹 Örnek: GDG Tanımlama
//DEFINEGDG JOB 'DEFINE GDG',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE GDG(NAME(MY.GDG.DATA) LIMIT(5) SCRATCH)
/*
📌 Bu ne yapar?
✅ MY.GDG.DATA adında bir GDG (Generation Data Group) oluşturur.
✅ LIMIT(5) → En fazla 5 nesil saklanır.
✅ SCRATCH → En eski nesil otomatik olarak silinir.
📌 GDG Kullanarak Yeni Bir Nesil Eklemek
//GDGWRITE JOB 'WRITE TO GDG',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=MYPROG
//NEWGEN DD DSN=MY.GDG.DATA(+1),DISP=(NEW,CATLG,DELETE)
📌 Bu ne yapar?
✅ GDG içinde yeni bir nesil (+1) oluşturur.
✅ Önceki nesillere zarar vermez.
💡 Bu yöntem, özellikle günlük yedeklemelerde kullanılır.
📌 SONUÇ: JCL ile DB2 ve VSAM Kullanımı
✅ DB2’ye JCL ile bağlanıp SQL sorguları çalıştırmayı öğrendik. ✅ VSAM veri setleri oluşturmayı ve yönetmeyi gördük. ✅ GDG (Generation Data Groups) kullanarak otomatik veri saklamayı öğrendik.
📌 JCL ile Batch İşleri ve Otomasyon (Adım 7)
Bu aşamada JCL’in otomasyon kabiliyetlerini inceleyeceğiz. Batch işlemleri, iş planlaması (scheduler) ve otomatik yedekleme gibi süreçleri nasıl yöneteceğimizi öğreneceğiz.
📌 1. Batch İşleri (Batch Processing) Nedir?
Batch işleme, büyük veri kümelerini veya tekrar eden görevleri belirli bir düzen içinde çalıştıran bir işlem türüdür.
🔹 Gerçek hayatta nerede kullanılır? ✅ Banka işlemlerinde (Örneğin, her gece müşteri bakiyelerinin güncellenmesi) ✅ Sigorta sektöründe (Poliçe yenileme, toplu ödeme işlemleri) ✅ Üretim ve lojistik yönetiminde (Stok kontrolü, fatura kesme işlemleri) ✅ Büyük veri analitiklerinde (Toplu raporlama işlemleri)
💡 Batch işlerinin avantajları:
- Kullanıcı müdahalesi gerektirmez.
- Büyük veri setleri ile verimli çalışır.
- Otomatik çalıştırılabilir ve zamanlanabilir.
📌 2. JCL ile Basit Bir Batch İşleme Betiği Yazma
Bir batch işleme betiği, genellikle bir veya daha fazla programı belirli bir sırayla çalıştıran bir JCL betiğidir.
🔹 Örnek: Bir müşteri hesaplarını güncelleyen bir batch job
//BATCHJOB JOB 'CUSTOMER UPDATE',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=UPDATEACCT
//INPUT DD DSN=BANK.CUSTOMERS,DISP=SHR
//OUTPUT DD DSN=BANK.UPDATED.ACCOUNTS,DISP=(NEW,CATLG,DELETE)
//SYSOUT DD SYSOUT=*
📌 Bu kod ne yapar?
✅ **UPDATEACCT programını çalıştırır.
✅ Banka müşteri verilerini okur (BANK.CUSTOMERS).
✅ Güncellenmiş hesap bilgilerini yeni bir dosyaya yazar (BANK.UPDATED.ACCOUNTS).
✅ Çalıştırma sonuçlarını SYSOUT aracılığıyla JES2 spool alanına yönlendirir.**
📌 3. İş Planlaması (Job Scheduling) ve Zamanlama Mekanizmaları
Batch işlemleri genellikle belirli zamanlarda veya belirli bir olay gerçekleştiğinde otomatik olarak çalıştırılır. Bunu yapmak için scheduler yazılımları kullanılır.
📌 3.1 JES2 ve JES3 ile İş Planlama
IBM mainframe sistemlerinde JES2 veya JES3, batch işlerini zamanlamak ve yönetmek için kullanılır.
🔹 Örnek: JES2 Kullanarak Belirli Saatte Çalıştırma
$ S BATCHJOB AT 23:00
📌 Bu komut, BATCHJOB işini saat 23:00’te** çalıştırır.
📌 3.2 Zamanlanmış İşleri Otomatik Çalıştırma (CA-7 ve Control-M)
Büyük kurumsal sistemlerde JCL işleri belirli saatlerde veya belirli koşullar gerçekleştiğinde çalıştırılabilir.
🔹 Örnek: Control-M Kullanarak Bir JCL İşini Planlama
CTMJOB: DAILY_REPORT
SCHEDULE: EVERY DAY AT 01:00
COMMAND: SUBMIT JOB(BATCHJOB)
📌 Bu iş her gece saat 01:00’de otomatik çalıştırılır.
💡 Kurumsal scheduler yazılımları şunlardır:
- CA-7 (Broadcom)
- Control-M (BMC)
- TWS (Tivoli Workload Scheduler — IBM)
Bu yazılımlar, JCL batch işlerini otomatik olarak belirli saatlerde veya belirli olaylar gerçekleştiğinde çalıştırır.
📌 4. Otomatik Yedekleme ve Arşivleme İşlemleri
Büyük ölçekli sistemlerde veri yedekleme ve arşivleme işlemleri genellikle otomatik olarak çalıştırılır.
📌 4.1 Günlük Yedekleme İşlemi Yapmak
🔹 Örnek: Günlük yedekleme işlemini otomatik hale getirme
//BACKUP JOB 'DAILY BACKUP',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
REPRO INFILE=PRODDATA OUTFILE=BACKUP.PRODDATA
/*
📌 Bu kod ne yapar?
✅ PRODDATA veri setinin bir yedek kopyasını oluşturur.
✅ Yedekleme dosyası **BACKUP.PRODDATA olarak saklanır.**
🔹 Örnek: Eski yedekleri otomatik silmek için GDG kullanımı
//BACKUPGDG JOB 'DAILY BACKUP GDG',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE BACKUP.GDG.DATA(-5)
/*
📌 Bu kod ne yapar? ✅ En eski 5. nesil yedeği otomatik olarak siler. ✅ Sadece en yeni 4 nesil yedek tutulur.
📌 4.2 Yedeklerin Tape (Manyetik Bant) Üzerine Alınması
🔹 Örnek: Yedekleri manyetik banta kaydetmek
//TAPEBACK JOB 'BACKUP TO TAPE',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=BACKUP.PRODDATA,DISP=SHR
//SYSUT2 DD UNIT=TAPE,DSN=TAPE.BACKUP,DISP=(NEW,CATLG,DELETE)
📌 Bu kod ne yapar?
✅ Verileri BACKUP.PRODDATA dosyasından okur.
✅ Çıktıyı manyetik bant (UNIT=TAPE) üzerine yazar.
💡 Manyetik bant yedekleme işlemleri genellikle büyük kurumsal sistemlerde kullanılır, çünkü uzun vadeli veri saklama için çok daha güvenlidir.
📌 5. JCL ile Otomatik Hata Yönetimi
Batch işlemlerinde bazı adımlar başarısız olursa sistemin buna otomatik tepki vermesi gerekir. Bunu yapmak için koşullu yürütme (COND) veya IF/THEN/ELSE blokları kullanılır.
🔹 Örnek: Bir iş başarısız olursa hata adımını çalıştırma
//BATCHJOB JOB 'CHECK ERRORS',MSGCLASS=A,CLASS=A
//STEP1 EXEC PGM=UPDATEACCT
// IF (STEP1.RC GE 8) THEN
//ERRORSTEP EXEC PGM=ERRHANDLER
// ENDIF
📌 Bu kod ne yapar?
✅ **STEP1 başarılı olursa ERRORSTEP çalışmaz.
✅ `STEP1hata verirse (RC>=8),ERRORSTEP` çalıştırılır.**
💡 Bu yöntem, otomatik hata kurtarma ve alternatif çözümler sunmak için kullanılır.
📌 SONUÇ: JCL ile Batch İşleri ve Otomasyon
✅ Batch işlerinin ne olduğunu ve nasıl çalıştığını öğrendik. ✅ JCL içinde batch işlemlerini nasıl yazacağımızı gördük. ✅ İş planlamasını (Job Scheduling) ve zamanlanmış işler ile otomasyonu öğrendik. ✅ Otomatik yedekleme ve hata yönetimi süreçlerini inceledik.
- Mainframe: Büyük ölçekli işletmeler tarafından kullanılan, yüksek güvenilirlik ve performansa sahip merkezi bilgisayar sistemleridir.
- JCL (Job Control Language): IBM mainframe sistemlerinde işleri tanımlamak, yönetmek ve çalıştırmak için kullanılan özel bir betik dilidir.Wikipedia
- Job (İş): Mainframe üzerinde çalıştırılan ve belirli bir görevi yerine getiren işlem kümesidir.
- Batch (Toplu İşlem): Kullanıcı etkileşimi olmadan, belirli zamanlarda otomatik olarak çalıştırılan işlemlerdir.
- JOB Satırı: JCL betiğinde işin başlangıcını ve genel ayarlarını belirten satırdır.
- EXEC Satırı: Çalıştırılacak programı veya işlemi belirten JCL satırıdır.
- DD (Data Definition) Satırları: JCL’de kullanılan giriş ve çıkış dosyalarını tanımlayan satırlardır.
- MSGCLASS: İşin ürettiği mesajların hangi çıktı sınıfına yönlendirileceğini belirten parametredir.
- CLASS: İşin önceliğini ve hangi kuyruğa yerleştirileceğini belirten parametredir.
- IEFBR14: Gerçek bir işlem yapmayan, genellikle test amaçlı kullanılan bir programdır.
- SYSOUT: İşin çıktısının nereye yönlendirileceğini belirten DD parametresidir.
- DISP (Disposition): Bir veri setinin (dosyanın) nasıl kullanılacağını ve işlendikten sonra ne yapılacağını belirten parametredir.
- DSN (Data Set Name): Kullanılacak veri setinin adını belirten DD parametresidir.
- SPACE: Yeni oluşturulan bir veri seti için ayrılacak disk alanını belirten parametredir.
- UNIT: Veri setinin hangi cihaz türünde saklanacağını belirten parametredir.
- SORT: Veri setlerini sıralamak için kullanılan bir programdır.
- SORTIN: Sıralama işlemi için giriş veri setini belirten DD adıdır.
- SORTOUT: Sıralama işlemi sonrası çıkış veri setini belirten DD adıdır.
- SYSIN: Programın çalışması için gerekli kontrol kartlarını veya komutlarını içeren DD adıdır.
- PGM (Program): EXEC satırında çalıştırılacak programın adını belirten parametredir.
- STEP: Bir iş (job) içindeki her bir işlem adımıdır.
- COND (Condition): Belirli koşullara bağlı olarak adımların çalıştırılmasını kontrol eden parametredir.
- PROC (Procedure): Tekrar kullanılabilir JCL kod bloklarını tanımlayan yapıdır.
- CATLG (Catalog): Yeni oluşturulan bir veri setinin sistem kataloğuna eklenmesini belirten DISP parametresi değeridir.
- DELETE: İşlem sonrası veri setinin silinmesini belirten DISP parametresi değeridir.
- SHR (Share): Veri setinin diğer işlemlerle paylaşılabileceğini belirten DISP parametresi değeridir.
- OLD: Veri setinin yalnızca bu iş tarafından kullanılacağını belirten DISP parametresi değeridir.
- MOD (Modify): Veri setine mevcut verilerin sonuna ekleme yapılacağını belirten DISP parametresi değeridir.
- LRECL (Logical Record Length): Veri setindeki her bir kaydın uzunluğunu belirten DCB parametresidir.
- BLKSIZE (Block Size): Veri setindeki blokların boyutunu belirten DCB parametresidir.
- DCB (Data Control Block): Veri setinin fiziksel özelliklerini tanımlayan parametredir.
- SYSDA: Sistemin varsayılan doğrudan erişimli depolama birimini belirten UNIT parametresi değeridir.
- CYL (Cylinder): Disk üzerindeki bir silindiri ifade eden alan birimidir.
- TRK (Track): Disk üzerindeki bir izi ifade eden alan birimidir.
- RLSE (Release): Kullanılmayan disk alanının serbest bırakılmasını belirten SPACE parametresi değeridir.
- SYSOUT=A: Çıktının “A” sınıfı yazdırma kuyruğuna yönlendirileceğini belirtir.
- MSGCLASS=A: Mesajların “A” sınıfı çıktı kuyruğuna yönlendirileceğini belirtir.
- CLASS=A: İşin “A” sınıfı öncelikle kuyruğa yerleştirileceğini belirtir.
- IEFBR14: Gerçek bir işlem yapmayan, genellikle dosya oluşturma veya silme işlemlerinde kullanılan bir programdır.
- SORT FIELDS: Sıralama işlemi
🎁 En Çok Kullanılan JCL DD Adları — Mini Rehber
DD AdıNe işe yarar?
SYSINGirdi komutları (parametre, kontrol kartı)
SYSPRINTProgram/utility çıktısı (log, mesajlar)
SYSOUTYazdırılabilir çıktı (JES spool)
SYSTSINTSO komutları ya da DB2 input komutları
SYSUDUMPHata durumunda dump alınacak dosya
SYSABENDProgram crash olursa detaylı hata raporu
SYSERRHata mesajları
메타데이터
- post_id
- e2d4fe39c3eb
- slug
- job-control-language-jcl-e2d4fe39c3eb
- url
- https://medium.com/@omermemes83/job-control-language-jcl-e2d4fe39c3eb
- canonical_url
- https://medium.com/@omermemes83/job-control-language-jcl-e2d4fe39c3eb
- author_url
- https://medium.com/@omermemes83
- status
- ok
- fetched_at
- 2026-06-26 06:47:43