ZOAUを呼び出すことで、Pythonプログラムからバッチジョブをサブミットしたり、スプールにアクセスしてジョブログなどのSYSOUTデータセットにアクセスすることができます。以下は、バッチジョブをサブミットしてジョブログを読み込み、最後にMVSコマンド「D△A,L」を発行するプログラム・サンプルです。ZOA UtilitiesのJobsとOperatorCmdを使用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# # ZOAU and Python Program under z/OS. # import os import time from zoautil_py import Jobs, OperatorCmd # list = Jobs.list(owner="userid") print(list) job_id = Jobs.submit("userid.JCL(JCLRUN)") print(job_id) time.sleep(10) text = Jobs.read_output(job_id,"JES2","JESMSGLG") print(text) OperatorCmd.execute(command="D", parameters="A,L") |
最初の「Jobs.list(owner=”userid”)」は、指定したジョブの一覧リストをPythonの辞書リストの形式で戻すJobs.listファンクションを、自分のユーザーIDをOWNERにしたパラメーターで呼び出しています。次の「Jobs.submit」は、ジョブのサブミットです。ジョブIDが戻されるので、それを使って後でジョブログを読み込みます。サンプルでは、サブミット後にジョブの終了を単純に10秒待つことで待ち合わせていますが、実際に作る場合はJOBID指定のJobs.listファンクションを呼び出して’status’がジョブの終了を示すまでジョブの予測実行時間に応じた秒数待つ方がいいでしょう。
3番目のJobs.read_outputファンクションで、ジョブログを読み込んでいます。ZOAUではSYSOUTデータセット単位でのアクセスを行うため、ジョブIDだけでなくステップ名とDD名も指定する必要があります。自分が作成したJCLでなくSYSOUTのDD名が不明な場合は、Jobs.list_ddsファンクションによってステップ名とDD名の一覧リストを戻してもらうこともできます。
最後のOperatorCmd.executeファンクションでMVSのオペレーターコマンド「D△A,L」を発行しています。サンプルではコマンドの応答を処理していませんが、コマンドの実行結果も辞書リストの形式で戻されるのでプログラム内で処理することもできます。
以下が、プログラムをUSSシェルから実行した結果です。(左右スクロール有り)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/u/userid > python3 zoau_test2.py [{'owner': 'Z?????', 'name': 'Z?????', 'id': 'TSU04980', 'status': 'AC', 'return': '?'}, {'owner': 'Z?????', 'name': 'Z?????P', 'id': 'JOB03011', 'status': 'CC', 'return': '0000'}, {'owner': 'Z?????', 'name': 'Z?????R', 'id': 'JOB03014', 'status': 'CC', 'return': '0000'}, {'owner': 'Z?????', 'name': 'Z?????P', 'id': 'JOB03013', 'status': 'CC', 'return': '0000'}, {'owner': 'Z?????', 'name': 'Z?????P', 'id': 'JOB05328', 'status': 'CC', 'return': '0000'}, {'owner': 'Z?????', 'name': 'Z?????P', 'id': 'JOB05362', 'status': 'CC', 'return': '0512'}, {'owner': 'Z?????', 'name': 'Z?????R', 'id': 'JOB05364', 'status': 'CC', 'return': '0000'}, {'owner': 'Z?????', 'name': 'Z?????P', 'id': 'JOB05363', 'status': 'CC', 'return': '0000'}, {'owner': 'Z?????', 'name': 'Z?????R', 'id': 'JOB05372', 'status': 'CC', 'return': '0000'}, {'owner': 'Z?????', 'name': 'Z?????P', 'id': 'JOB05371', 'status': 'CC', 'return': '0000'}, {'owner': 'Z?????', 'name': 'Z?????P', 'id': 'JOB05374', 'status': 'CC', 'return': '0000'}] JOB05379 1 J E S 2 J O B L O G -- S Y S T E M S 0 W 1 -- N O D E S V S C J E S 2 0 02.56.14 JOB05379 ---- SUNDAY, 04 JUL 2021 ---- 02.56.14 JOB05379 IRR010I USERID Z????? IS ASSIGNED TO THIS JOB. 02.56.14 JOB05379 ICH70001I Z????? LAST ACCESS AT 02:51:49 ON SUNDAY, JULY 4, 2021 02.56.14 JOB05379 $HASP373 Z?????R STARTED - INIT 1 - CLASS A - SYS S0W1 02.56.15 JOB05379 - -----TIMINGS (MINS.)------ -----PAGING COUNTS---- 02.56.15 JOB05379 -STEPNAME PROCSTEP RC EXCP CONN TCB SRB CLOCK SERV WORKLOAD PAGE SWAP VIO SWAPS 02.56.15 JOB05379 -GO 00 260 32 .00 .00 .0 86 SYSTEM 0 0 0 0 02.56.15 JOB05379 -Z?????R ENDED. NAME-Z????? TOTAL TCB CPU TIME= .00 TOTAL ELAPSED TIME= .0 02.56.15 JOB05379 $HASP395 Z?????R ENDED - RC=0000 0------ JES2 JOB STATISTICS ------ - 04 JUL 2021 JOB EXECUTION DATE - 9 CARDS READ - 55 SYSOUT PRINT RECORDS - 0 SYSOUT PUNCH RECORDS - 3 SYSOUT SPOOL KBYTES - 0.01 MINUTES EXECUTION TIME /u/userid > |
最初の「[{‘owner’: ‘Z?????’,から’return’: ‘0000’}]」までの部分が、Jobs.listファンクションの応答内容です。次の「JOB05379」がサブミットしたジョブのジョブIDです。3番目が、サブミットしたジョブJOB05379のジョブログの部分をJobs.read_output(job_id,”JES2″,”JESMSGLG”)ファンクションで読み込んだ(SYSOUTデータセットの)内容を格納したtext変数の内容です。
紹介したのはISPFエディターでのJCLサブミットとSDSFでのSYSOUT表示に対応したPython+ZOAUのサンプルですが、非同期に実行されるバッチジョブでMVS側の処理を行うとPython側との同期合わせが面倒です。実際の非定型処理の自動化などでは、USS側からバッチジョブをサブミットするのではなくプログラムを直接実行するMVSCmd.executeファンクションが使いやすいかも知れません。