`
dannyhz
  • 浏览: 397815 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

kill machine function

阅读更多
create or replace
PROCEDURE        gce_kill_machine (p_machine IN VARCHAR2, p_timeout_minutes IN NUMBER DEFAULT 30)
IS
   l_inst_id           NUMBER;
   l_sid               NUMBER;
   l_serial            NUMBER;
   lv_login_minutes    NUMBER;
   l_sql               VARCHAR2 (32000);
   l_session_user      VARCHAR2 (64);
   l_status            VARCHAR2(8);
   l_osuser            VARCHAR2(30);
   l_process           VARCHAR2(24);
   l_machine           VARCHAR2(64);
   l_port              NUMBER;
   l_program           VARCHAR2(48);
   l_module            VARCHAR2(64);
   l_logon_time        date;
   l_event             VARCHAR2(64);
   l_sql_id            VARCHAR2(13);
   l_prev_sql_id       VARCHAR2(13);
   l_sql_text          VARCHAR2(1000);
   l_prev_sql_text     VARCHAR2(1000);
   l_kill_user         VARCHAR2(30);
   l_kill_os_user      VARCHAR2(30);
   l_kill_machine      VARCHAR2(64);
   l_kill_program      VARCHAR2(48);
   cur_sessions        sys_refcursor;
BEGIN

   l_kill_user := sys_context('USERENV','SESSION_USER');
   l_kill_os_user := sys_context('USERENV','OS_USER');
   l_kill_machine := sys_context('USERENV','HOST');
   l_kill_program := sys_context('USERENV','MODULE');

   -- query the information of the session to be killed
   open cur_sessions for
     SELECT inst_id,sid,serial#,username,status,osuser,process,machine,port,program,module,logon_time,
            event,sql_id,prev_sql_id
     FROM gv$session gs
     WHERE username='OPGCEP2'
       AND machine=p_machine
       AND STATUS!='KILLED'
       AND audsid!=USERENV('SESSIONID')
       AND not exists (select distinct inst_id, sid
                       from gv$mystat gm
                       where gm.inst_id=gs.inst_id and gm.sid=gs.sid
                      );
   LOOP
     FETCH cur_sessions
     INTO l_inst_id,l_sid,l_serial,l_session_user,l_status,l_osuser,l_process,l_machine,l_port,l_program,
          l_module,l_logon_time,l_event,l_sql_id,l_prev_sql_id;
     EXIT WHEN cur_sessions%NOTFOUND;

     if l_sql_id is not null then
       begin
         SELECT sql_text into l_sql_text
         FROM gv$sql
         WHERE child_number = 0
         AND inst_id = l_inst_id
         AND sql_id = l_sql_id;
       exception
         when others then
           l_sql_text := '';
       end;
     end if;

     if l_prev_sql_id is not null then
       begin
         SELECT sql_text into l_prev_sql_text
         FROM gv$sql
         WHERE child_number = 0
         AND inst_id = l_inst_id
         AND sql_id = l_prev_sql_id;
       exception
         when others then
           l_prev_sql_text := '';
       end;
     end if;

     -- ONLY ALLOW sessions which logged in p_timeout_minutes(such as 30) minutes ago to be killed
     lv_login_minutes := (sysdate - l_logon_time)*24*60;
     IF lv_login_minutes > p_timeout_minutes
     THEN
        merge into GCE_MAINT.KILL_SESSION_LOG T0
        using(select l_inst_id inst_id,l_sid sid,l_serial serial#,l_kill_user kill_user,l_kill_os_user kill_os_user,l_kill_machine kill_machine,l_kill_program kill_program
                     ,sysdate kill_time,l_session_user session_user,l_status status,l_osuser os_user,l_process process,l_machine machine,l_port port,l_program program,l_module module
                     ,l_logon_time logon_time,l_event event,l_sql_id sql_id,l_prev_sql_id prev_sql_id,l_sql_text sql_text,l_prev_sql_text prev_sql_text from dual) T1
        on (T0.inst_id=T1.inst_id and T0.sid=T1.sid and T0.serial#=T1.serial# and T0.logon_time=T1.logon_time)
        when matched then
          update set t0.kill_user=t1.kill_user, t0.kill_os_user=t1.kill_os_user, t0.kill_machine=t1.kill_machine
          , t0.kill_program=t1.kill_program, t0.kill_time=t1.kill_time, t0.username=t1.session_user, t0.status=t1.status
          , t0.osuser=t1.os_user, t0.process=t1.process, t0.machine=t1.machine, t0.port=t1.port, t0.program=t1.program
          , t0.module=t1.module, t0.event=t1.event, t0.sql_id=t1.sql_id
          , t0.prev_sql_id=t1.prev_sql_id, t0.sql_text=t1.sql_text, t0.prev_sql_text=t1.prev_sql_text
        when not matched then
          insert(
          INST_ID
          ,SID
          ,SERIAL#
          ,KILL_USER
          ,KILL_OS_USER
          ,KILL_MACHINE
          ,KILL_PROGRAM
          ,KILL_TIME
          ,USERNAME
          ,STATUS
          ,OSUSER
          ,PROCESS
          ,MACHINE
          ,PORT
          ,PROGRAM
          ,MODULE
          ,LOGON_TIME
          ,EVENT
          ,SQL_ID
          ,PREV_SQL_ID
          ,SQL_TEXT
          ,PREV_SQL_TEXT
        )
        values(
          l_inst_id
          ,l_sid
          ,l_serial
          ,l_kill_user
          ,l_kill_os_user
          ,l_kill_machine
          ,l_kill_program
          ,sysdate
          ,l_session_user
          ,l_status
          ,l_osuser
          ,l_process
          ,l_machine
          ,l_port
          ,l_program
          ,l_module
          ,l_logon_time
          ,l_event
          ,l_sql_id
          ,l_prev_sql_id
          ,l_sql_text
          ,l_prev_sql_text
        );
        COMMIT;

        -- FORMAT OF KILL SESSION statement
        -- e.g. -- alter system kill session '18,21349,@3' immediate;
        l_sql :=
              'alter system kill session '''
           || TO_CHAR (l_sid)
           || ', '
           || TO_CHAR (l_serial)
           || ', @'
           || TO_CHAR (l_inst_id)
           || ''' immediate';
        DBMS_OUTPUT.PUT_LINE (l_sql);

        -- Actually KILL session now: e.g. alter system kill session '4, 47438, @1' immediate
        EXECUTE IMMEDIATE (l_sql);
     ELSE
        DBMS_OUTPUT.
        PUT_LINE ('*** ERROR: Cannot KILL session ('||to_char(l_sid)||','||to_char(l_serial)||',@'||to_char(l_inst_id)||') since it just logged in '|| to_char(lv_login_minutes) ||' minutes! ***');
     END IF;
   END LOOP;
   CLOSE cur_sessions;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      DBMS_OUTPUT.PUT_LINE ('ERROR: No such session');
      ROLLBACK;
      RAISE;
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE ('ERROR: '||substr(SQLERRM,1,1000));
      ROLLBACK;
      RAISE;
END;
分享到:
评论

相关推荐

    kill_folder 专杀

    "kill_folder 专杀"工具是一款专门针对名为"kill_folder"的文件病毒设计的安全软件。在深入了解这个工具之前,我们首先要理解什么是文件病毒以及它如何影响计算机系统。 文件病毒是一种恶意软件,它会附着在可执行...

    Kill FI.pdf

    "Kill FI.pdf" 根据提供的文件信息,我们可以从多方面生成相关的知识点。 首先,根据文件标题"Kill FI.pdf",我们可以推断出该文件可能与金融行业或投资相关。其中,"FI"可能是Financial Institution(金融机构)...

    KILL杀毒软件 8.1

    ### KILL杀毒软件 8.1 知识点解析 #### 一、产品概述 KILL杀毒软件是由冠群金辰公司研发的一款高性能桌面防病毒软件,它旨在为用户提供全面的防护措施来抵御各类恶意软件(如病毒、蠕虫、木马等)的侵袭,保障用户...

    KILL5.2.1安装教程.pdf

    KILL5.2.1安装教程.pdf

    oracle kill session

    ### Oracle Kill Session:详解与实践 在Oracle数据库管理与维护过程中,“Oracle Kill Session”是一项非常重要的操作技巧。本文将从理论到实践多个层面深入探讨如何有效地执行“Oracle Kill Session”,帮助...

    Shell kill tomcat process

    例如,`jps`(Java Virtual Machine Process Status Tool)是一个用于显示JVM进程状态的工具,可以用来快速查看Tomcat是否在运行。 在提供的文件列表中,我们看到几个与单元测试和模拟有关的库文件: - **dbunit-...

    VB的kill删除功能程序(VB6.0代码编写)

    在VB6.0(Visual Basic 6.0)编程环境中,`Kill`函数是一个非常基础且重要的功能,它用于删除指定的文件。本程序主要关注如何利用VB6.0的`Kill`语句来实现文件的删除操作。下面将详细阐述`Kill`函数的使用方法、相关...

    pskill 杀掉进程

    pskill pskill 杀掉进程,win2000等系统使用。 可杀掉系统进程

    文件夹病毒专杀kill_folder2.12最新版

    《文件夹病毒专杀工具Kill_Folder 2.12详解》 在信息化时代,电脑病毒无处不在,其中文件夹病毒尤其让人头疼。这类病毒会感染用户的重要文件夹,导致数据丢失或系统瘫痪。为此,专业防病毒软件Kill_Folder应运而生...

    linuxps命令、kill命令及kill函数概述[借鉴].pdf

    Linux ps 命令、kill 命令及 kill 函数概述 Linux 操作系统中,ps 命令和 kill 命令是两个非常重要的命令,分别用于显示进程信息和中止进程。这两个命令在 Linux 系统中扮演着非常重要的角色。 ps 命令是用于显示...

    Kill run进程工具

    在IT领域,"Kill run进程工具"通常指的是用于管理和终止操作系统中运行的进程的软件工具。这类工具允许用户查看系统中的所有活动进程,并选择性地结束特定进程,以解决资源占用过高、程序无响应或者需要重启服务等...

    文件夹病毒专杀工具 kill_folder

    文件夹病毒专杀工具 kill_folder 文件夹病毒专杀工具 kill_folder

    kill_auto.rar_ kill_auto_kill au_kill auto_kill-au_kill-auto

    标题中的“kill_auto.rar_ kill_auto_kill au_kill auto_kill-au_kill-auto”暗示了这是一个与自动杀毒相关的压缩文件,可能包含一系列用于消除特定病毒或恶意软件的工具。描述明确指出这是一个杀毒软件工具,专门...

    Y2Kill

    【Y2Kill】是一个与字体相关的技术主题,这个名字可能源于计算机领域的“Year 2000 problem”(千年虫问题)或“Y2K bug”,指的是在20世纪末期,许多计算机程序中的日期处理问题,因为使用了两位数表示年份,导致...

    kill_folder1.9

    "Kill_Folder1.9"是一款专为U盘设计的杀毒工具,旨在帮助用户清除U盘中的病毒和恶意软件,保障数据安全。这个压缩包文件"kill_folder1.9.rar"包含了主要的执行程序"kill_folder.exe",它是整个软件的核心部分。 一...

    Kill Process (进程结束工具)

    《Kill Process:高效而强大的进程结束工具》 在日常计算机使用中,我们有时会遇到某个程序无响应或者占用过多资源,这时,系统自带的任务管理器往往成为我们的首选工具来结束这些不良行为的进程。然而,任务管理器...

    Pentakill.zip

    Pentakill

    Kill_Autorun.rar

    《Kill_Autorun:小巧而强大的自动运行病毒克星》 在数字时代,电脑安全问题日益突出,尤其是autorun病毒的肆虐,让许多用户深受其害。为此,诞生了一款名为"Kill_Autorun"的专业工具,它以其小巧的体积和强大的...

    pskill_cmd结束程序

    其中,“pskill”是一个非常实用的命令行工具,它主要用于远程或本地系统上强制终止进程。本文将深入探讨“pskill_cmd结束程序”的概念、使用方法以及相关的知识点。 “pskill”是Windows Sysinternals Suite中的一...

    wince6.0 kill进程

    "wince6.0 kill进程"这个主题涉及到如何在WinCE环境中终止指定的进程。下面我们将深入探讨这个话题。 首先,WinCE是一个实时嵌入式操作系统,它不像桌面版Windows那样拥有图形化的任务管理器来方便地管理进程。在...

Global site tag (gtag.js) - Google Analytics