停正在运行的job

 1.找出正在执行的JOB编号及其会话编号
SELECT   SID,JOB   FROM   DBA_JOBS_RUNNING;
停止该JOB的执行
EXEC   DBMS_JOB.BROKEN(&JOB,TRUE);

2.如果dbms_job.broken不能停止job

可以找到正在运行job的会话,然后把会话kill掉

SELECT   SID,SERIAL#   FROM   V$SESSION   WHERE   SID='&SID';
ALTER   SYSTEM   KILL   SESSION   '&SID,&SERIAL';

实例分析:
1,查询正在运行的Job,通过查询有两个,和进程占用较多的是两个ORACLE进程符合
SQL> SELECT   SID,JOB   FROM   DBA_JOBS_RUNNING;
SID        JOB
---------- ----------
12        116
16        117

2.如果不希望运行上述job的话,可以将job设置为broken.
EXEC   DBMS_JOB.BROKEN(116,TRUE);
EXEC   DBMS_JOB.BROKEN(117,TRUE);
根据个人经验,这种方法并不会立即中断job的运行,最好是找到job对应的会话kill掉。 
3,查询正在运行的job的信息
SQL>  SELECT   SID,SERIAL#   FROM   V$SESSION   WHERE   SID='12';
SID    SERIAL#
---------- ----------
12          3
SQL> SELECT   SID,SERIAL#   FROM   V$SESSION   WHERE   SID='16';
SID    SERIAL#
---------- ----------
16          1
4利用查询出来的job信息将job结束掉
SQL> ALTER   SYSTEM   KILL   SESSION '12,3';
System altered.
SQL> ALTER   SYSTEM   KILL   SESSION '16,1';
System altered.
 

 

<think>我们正在讨论AS400系统中查找JOB运行时RPG程序出错位置的方法。根据用户的问题,我们需要提供在RPG程序运行出错时如何定位错误位置的方法。 根据之前的引用[2],提到了在RPG程序中使用调试工具(debug)来设置断点,从而可以检查程序运行状态。具体步骤如下: 1. 启动调试环境:使用命令 STRDBG PGM (PGMA),其中PGMA是程序名。 2. 设置断点:使用命令 ADDBKP STMT (1500) PGMVAR('&A' '&B'),其中1500是语句号(行号),PGMVAR参数可以指定要监视的程序变量。 3. 运行程序:当程序运行到断点时,会暂并显示断点信息,此时可以检查变量值。 4. 结束调试环境:使用命令 ENDDBG。 但是,用户的问题是在程序出错时查找出错位置。在RPG程序中,当出现错误时,通常会在作业日志(Job Log)中记录错误消息。通过查看作业日志,可以获取错误消息ID和错误发生的程序名、过程名和语句行号。 另外,RPG程序本身可以使用错误处理机制来捕获错误,例如使用INFSR(文件信息子例程)、*PSSR(程序状态子例程)或现代化的MONITOR-ON ERROR结构。通过错误处理程序,可以记录错误发生的位置。 结合引用[1]中提到的错误信息表,程序错误信息可能被记录并拼接,但定位错误位置还需要调试工具或作业日志。 因此,方法可以总结为: 方法1:通过作业日志定位错误 - 使用DSPJOBLOG命令查看作业日志,找到错误消息。错误消息中通常会包含程序名、模块名和语句号(行号)。 方法2:使用调试工具(Debug)进行调试 - 启动调试(STRDBG)并在可能出错的程序上设置断点,或者运行程序直到错误发生,调试器会在错误位置。 方法3:在程序中加入错误处理代码 - 在RPG程序中使用MONITOR-ON ERROR结构,在发生错误时,使用DUMP操作码生成程序状态转储(dump),其中包含出错位置。 - 或者使用*PSSR子例程,在子例程中获取错误信息并记录(如写入日志文件)。 具体步骤(以调试为例): 1. 启动调试:STRDBG PGM(你的程序名) UPDPROD(*YES) (UPDPROD(*YES)允许在生产环境中调试,但需谨慎) 2. 设置服务作业:如果程序在批处理作业中运行,需要将调试器附加到正在运行的作业上。使用命令:STRDBG UPDPROD(*YES) JOB(作业号)(或者通过WRKACTJOB找到作业号) 3. 设置断点:如果知道可能出错的语句行号,使用ADDBKP设置断点。或者,可以使用ADDBKP ELP(错误位置)命令,让调试器在错误发生时中断。 4. 让作业继续运行,当错误发生时,调试器会中断并显示错误位置和变量值。 5. 使用DSPMODSRC命令显示模块源代码,结合断点信息查看具体语句。 另外,还可以使用Dump分析: - 在程序中发生错误时,系统会自动生成dump。使用DSPJOB OPTION(*DFN)查看转储信息,其中会包含程序计数器(PC)的值,通过PC值可以定位到出错的具体指令。 但是,需要注意的是,在RPG中,我们通常使用行号来定位,而dump中的偏移地址需要映射到源程序的语句行号。这可以通过编译列表(listing)来查找。 总结步骤: 1. 查看作业日志(DSPJOBLOG)获取错误消息和程序位置。 2. 如果错误消息没有提供足够的信息,使用调试工具重新运行作业(或附加到作业)进行调试。 3. 在程序中使用错误处理子例程记录更多上下文信息。 引用[2]中提到的设置断点的方法是一种主动调试的方法,适用于开发测试环境。在生产环境中,我们可能需要使用更安全的方式,例如记录日志或生成转储文件。 根据这些内容,我们回答用户的问题,并提供相关问题。 </think>在AS400系统中查找JOB运行时RPG程序出错位置,可通过以下方法实现: ### 一、调试工具定位法(推荐) 1. **启动调试环境** 使用命令启动程序调试器: ```cl STRDBG PGM(您的程序名) UPDPROD(*YES) ``` - `UPDPROD(*YES)`允许在生产环境调试(需谨慎) - 附加到运行中的JOB:`STRDBG JOB(作业号)`[^2] 2. **设置断点** - 按语句号设置断点: ```cl ADDBKP STMT(1500) /* 在1500行设置断点 */ ``` - 按变量值中断: ```cl ADDBKP PGMVAR('&ERROR_FLAG') /* 当错误标志变量变化时中断 */ ``` 3. **运行监控** 程序暂时,使用以下命令查看状态: - `DSPMODSRC`:显示当前模块源代码 - `EVAL`:检查变量值(如`EVAL &ERR_CODE`) - `DSPJOBLOG`:查看实时作业日志 4. **结束调试** ```cl ENDDBG ``` ### 二、程序级错误处理 在RPG程序中内置错误捕获: ```rpg // 文件操作错误捕获(F规范) FMYFILE UF E K DISK INFDS(FileDS) D FileDS DS INFSR(*PSSR) // 启用错误子例程 D MsgID 7A OVERLAY(FileDS:46) // 消息ID位置 // 全局错误处理(*PSSR子例程) C *PSSR BEGSR C DUMP(A) // 自动生成转储文件 C EVAL *INLR = *ON // 强制结束程序 C RETURN C ENDSR ``` ### 三、日志分析流程 1. **获取错误消息ID** - 通过`DSPJOBLOG`查看作业日志,定位形如`*RNF7009`的异常消息ID 2. **分析程序转储** - 使用`DSPJOB OPTION(*DFN)`查看转储文件 - 关键字段: - `Program Counter(PC)`:出错指令地址 - `Statement Number`:源代码行号 - `Data Space(DS)`:错误时的变量值 3. **映射源代码** 通过编译列表(`DSPPGMREF PGM(您的程序)`)将机器指令地址映射回RPG源代码行号 > 示例:当作业日志显示`RNF1213`(文件未打开),转储文件中的`DS`会显示未打开的文件名,结合`*PSSR`子例程记录的变量值可精确定位[^1][^2]。 --- ### 最佳实践建议 1. **预置调试符号** 编译时添加`DBGVIEW(*LIST)`或`DBGVIEW(*SOURCE)`保留调试信息 2. **自动化错误日志** 在`*PSSR`子例程中写入日志文件: ```rpg C *PSSR BEGSR C OPEN LOGFILE C WRITE LOG_REC // 记录时间戳/程序名/行号/变量 C CLOSE LOGFILE C ENDSR ``` 3. **集中监控** 使用`QUMHOMSG` API实时捕获系统消息队列中的异常消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值