Pythonからバッチジョブをサブミットして実行後のジョブログを読み込む

ZOAUを呼び出すことで、Pythonプログラムからバッチジョブをサブミットしたり、スプールにアクセスしてジョブログなどのSYSOUTデータセットにアクセスすることができます。以下は、バッチジョブをサブミットしてジョブログを読み込み、最後にMVSコマンド「D△A,L」を発行するプログラム・サンプルです。ZOA UtilitiesのJobsとOperatorCmdを使用しています。

最初の「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シェルから実行した結果です。(左右スクロール有り)

最初の「[{‘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ファンクションが使いやすいかも知れません。