如何判断SBMJOB执行完毕?求按顺序执行两个SBMJOB的方案
在IBM i中实现SBMJOB的顺序执行(Program A完成后再执行Program B)
核心实现方案
方案一:循环检查作业状态后提交Program B
适合简单场景,通过定期检查Program A的作业状态,确认完成后再提交Program B。
- 提交Program A
SBMJOB CMD(CALL PGM(PROGRAM1) PARM(PARM1 PARM2)) JOB(PROGRAM1)
- 编写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完成后自动执行,无需手动循环检查。
- 提交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)
- 提交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
相关产品推荐
相关产品推荐

