2017-07-19 63 views
0

我正在使用shell脚本,当一个语句被识别为长时间运行时,我们必须在OS上获取PID,确保它不是程序的主进程。 (例如:Oracle)。检查top并杀死匹配的进程,稍后我们可以使用脚本检查数据库是否存在长时间运行的会话。在查杀程序特定的长时间运行的PID之后,shell脚本需要向用户发送邮件信息。使用shell脚本长时间运行oracle db的多个会话

[[email protected] ]$ps au |grep oracle | awk 'print {$2}' |uniq 
10020 
15678 
17345 
18736 
18856 

我的问题这里我没有看到在顶部命令的任何上述过程的上市,所以我应该如何验证脚本中这些不存在的流程?还是有更好的一个班轮或代码片段可以做到这一点?任何建议,非常感谢。

感谢

+0

检查文档'SQLNET.RECV_TIMEOUT',也许它可以帮助你。 https://docs.oracle.com/cd/E11882_01/network.112/e10835/sqlnet.htm#NETRF227 – Azize

回答

0

杀害从服务器的会话是非常危险的,它可能会导致不明确的数据和表格,甚至无法读取行。最好通过检查v$session视图中的相同来杀死长时间运行的会话。在这里,您可以检查会话是否处于非活动状态或正在等待另一个会话完成。

要杀死一个会话使用alter system kill session 'sid,serial#' immediate;,其中可以在v$session视图中找到sid和serial#。为了得到一个会话的服务器PID可以查询v$processv$session与此查询访问量:

SELECT s.sid, s.serial#, s.username, p.spid, s.machine, p.terminal 
FROM v$session s, v$process p 
WHERE s.paddr = p.addr; 
+0

Hi Lohit, 感谢您的建议,但是我们能否至少检查一下比较上面列出的进程或SPID流行的顶级流程,然后我们可以验证吗?在从oracle中查杀之前,我只需要验证它是否是我们正在查杀的主要oracle进程。并且Oracle进程只是一个示例,我们还有许多其他可执行文件可供比较。任何建议,非常感谢.. !!谢谢。 – Pavan

+0

为此,您可以从顶部获取SPID,并检查在这些进程中执行的是什么,因为大多数闲置进程不会显示在最高CPU消耗进程中。要检查在oracle进程中执行什么操作,可以查看[this](http://www.acehints.com/2014/06/oracle-query-to-find-out-sql-text-using.html )链接。 –