You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断SBMJOB执行完毕?求按顺序执行两个SBMJOB的方案

在IBM i中实现SBMJOB的顺序执行(Program A完成后再执行Program B)

核心实现方案

方案一:循环检查作业状态后提交Program B

适合简单场景,通过定期检查Program A的作业状态,确认完成后再提交Program B。

  1. 提交Program A
SBMJOB CMD(CALL PGM(PROGRAM1) PARM(PARM1 PARM2)) JOB(PROGRAM1)
  1. 编写CL程序循环检查并触发Program B
DCL VAR(&LOOP) TYPE(*LGL) VALUE('1')

DO WHILE &LOOP
  -- 检查Program A作业是否存在
  CHKJOB JOB(PROGRAM1)
  MONMSG MSGID(CPF1001) EXEC(DO)
    -- 作业不存在,说明已完成,提交Program B
    CHGVAR VAR(&LOOP) VALUE('0')
    SBMJOB CMD(CALL PGM(PROGRAM2) PARM(PARM1 PARM2)) JOB(PROGRAM2)
  ENDDO
  DLYJOB DLY(15) -- 每15秒检查一次,可按需调整间隔
ENDDO

方案二:使用作业依赖自动触发(推荐)

通过IBM i的作业依赖功能,让Program B在Program A完成后自动执行,无需手动循环检查。

  1. 提交Program A并捕获作业标识
DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
DCL VAR(&JOBUSER) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBSYS) TYPE(*CHAR) LEN(8)

-- 提交Program A
SBMJOB CMD(CALL PGM(PROGRAM1) PARM(PARM1 PARM2)) JOB(PROGRAM1)
-- 获取刚提交的作业的完整标识
RTVSBMJOB JOB(&JOBNBR/&JOBUSER/&JOBSYS)
  1. 提交Program B并设置依赖
-- 先提交Program B并保持挂起状态
SBMJOB CMD(CALL PGM(PROGRAM2) PARM(PARM1 PARM2)) JOB(PROGRAM2) HOLD(*YES)
-- 添加依赖:仅当Program A完成后,Program B才允许执行
ADDJOBDEPE JOB(PROGRAM2) DEPTYPE(*COMPLETION) DEPJOB(&JOBNBR/&JOBUSER/&JOBSYS)
-- 解除挂起,让Program B等待依赖满足
CHGJOB JOB(PROGRAM2) HOLD(*NO)

验证Program A完成的方式

  • 命令行手动检查:执行WRKJOB JOB(PROGRAM1),查看作业状态字段,当状态为COMPLETED或ENDED时,说明作业已完成。
  • CL程序自动化检查:通过WRKJOB OUTPUT(*OUTFILE)将作业信息导出到文件,读取文件中的状态字段;或者通过捕获CHKJOB命令的CPF1001消息(作业不存在)来判断作业已结束。
  • SQL查询系统视图:查询QSYS2.JOB_INFO视图获取作业状态:
SELECT JOB_STATUS 
FROM QSYS2.JOB_INFO 
WHERE JOB_NAME = 'PROGRAM1' 
  AND JOB_USER = '你的用户名';

若查询无结果或JOB_STATUS为COMPLETED,则表示Program A已完成。

内容的提问来源于stack exchange,提问作者makoto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:24:26