unix kill命令
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unix kill命令相关的知识,希望对你有一定的参考价值。
小弟最近在倒腾oracle的时候,Unix经常遇到死进程,需要kill掉,只知道用kill -9 pid,但是kill后面的数字很多,就是不明白区别和含义及作用,上网查,都是你朝我 我抄你,没一个说的清楚 ,没什么意义,始终不解kill命令后的各数字参数的作用,望大侠不吝赐教…………
从网上抄的就不用回答了,我也基本上都看过。现在只需大侠们说说个参数的作用。例如:-9 强行终止进程……
kill -sig pid
这里的 sig 可以是信号对应的数字,也可以是信号名,比如你如果用 kill -9 pid 实际是发 9号信号给进城,9对应的信号名是 KILL。所以 kill -9 等价于 kill -KILL pid。 常用的几个信号是
INT 2 这个就是你在bash下面用Ctrl+C 来结束一个程序时,bash会向进程发送这个信号,默认的,进程收到这个程序会结束。 你可以用 kill -INT pid 来发这个信号。
QUIT 3 这个是你在bash下用 Ctrl+\ 来结束程序时,发的信号,进程默认受到这个信号后也是结束
KILL 9 这个信号之所以被称为“强杀”,就是因为无法改变进程收到这个信号后所执行的动作,进程只能退出。 (前面说的两个信号,虽然默认是退出,但是应用程序自己可以通过signal系统调用来修改成其他动作,比如忽略那两个信号等动作)
更多信息,可以man kill, 另外可以学习一下linux的信号机制,信号相关的系统调用等。对我说的有什么不明白之处,可以baidu hi我。
别忘了加分 :) 参考技术A kill -n pid 其实就是unix系统给指定的pid的进程发送信号的一个过程.9只是其中一个信号,程序执行阶段捕获到自己的信号就会做出响应的反应.当然程序也可以忽略一部分信号.
“信号”是指那些被异步发送到一个程序的事件。默认情况下,它们通常会终止一个程序的运行。
1) 查看有哪些信号及其编号
$ trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX
2) 信号详情
名称 默认动作 说明
SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGQUIT 建立CORE文件 终止进程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟踪自陷
SIGBUS 建立CORE文件 总线错误
SIGSEGV 建立CORE文件 段非法错误
SIGFPE 建立CORE文件 浮点异常
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL 终止进程 杀死进程
SIGPIPE 终止进程 向一个没有读进程的管道写数据
SIGALARM 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号
SIGSTOP 停止进程 非终端来的停止信号
SIGTSTP 停止进程 终端来的停止信号
SIGCONT 忽略信号 继续执行一个停止的进程
SIGURG 忽略信号 I/O紧急信号
SIGIO 忽略信号 描述符上可以进行I/O
SIGCHLD 忽略信号 当子进程停止或退出时通知父进程
SIGTTOU 停止进程 后台进程写终端
SIGTTIN 停止进程 后台进程读终端
SIGXGPU 终止进程 CPU时限超时
SIGXFSZ 终止进程 文件长度过长
SIGWINCH 忽略信号 窗口大小发生变化
SIGPROF 终止进程 统计分布图用计时器到时
SIGUSR1 终止进程 用户定义信号1
SIGUSR2 终止进程 用户定义信号2
SIGVTALRM 终止进程 虚拟计时器到时 参考技术B 在杀死进程前,是需要用命令查看一下当前都有哪些进程存在,查看进程的命令有很多,比如 ps -ef命令可以查看当前运行的所有进程,如果想过滤可以用管道进行筛选,比如想一下现在有哪些java进程ps -ef | grep java 现在有哪些shell进程 ps -ef | grep sh 只有查看到了你要杀掉的进程后才可以对进程进行杀死操作,kill -9命令是绝对的杀掉进程的命令,不允许系统进行命令的忽略,必须强制执行的。kill -9 86228 指的是杀掉进程号为86228的这个进程,用ps -ef查看进程后显示的各列分别是ID PID PPID C STIME TTY TIME CMD ,所以kill -9 PID 也就是查看进程所列出的第二列的值。 参考技术C -IUT 发送中断码
-HALT 挂起
-9 强杀
-KILL 更强杀
kill -3 获取java线程转储
【中文标题】kill -3 获取java线程转储【英文标题】:kill -3 to get java thread dump 【发布时间】:2011-06-20 01:30:05 【问题描述】:我正在使用kill -3
命令在 unix 中查看 JVM 的线程转储。但是我在哪里可以找到这个kill
命令的输出?我迷路了!!
【问题讨论】:
你要杀死哪个进程?它是 J2EE 应用服务器吗?如果是这种情况,您应该在标准输出中找到堆栈跟踪。 我正在杀死一个运行 java 类的进程 不应该在控制台上写线程转储。因为java类有控制台作为标准输出 【参考方案1】:您也可以使用 jstack(包含在 JDK 中)进行线程转储并将输出写入您想要的任何位置。这在 unix 环境中不可用吗?
jstack PID > outfile
【讨论】:
是的 - 在它运行的时间点。您还可以为打印附加锁定信息的长列表指定 -l(小写 L) 直到 jstack 命令由于“无法从地址推断线程类型”而持续失败;-( 如果您看到该错误,建议您与供应商联系。快速搜索显示,例如,RHEL 中有一个关于此错误和 openjdk 的开放错误... 值得注意的是jstack需要JDK。如果您在仅安装了 JRE 的服务器上运行应用程序,则需要找到另一种线程转储方法。 这里是如何使用 jstack 来获取在不同用户下运行的进程的线程转储,例如 windows 服务:***.com/questions/1197912/…【参考方案2】:线程转储从您执行kill -3
的VM 写入系统。如果您将 JVM 的控制台输出重定向到文件,则线程转储将在该文件中。如果 JVM 在打开的控制台中运行,则线程转储将显示在其控制台中。
【讨论】:
有一种方法可以将 JVM 线程转储输出重定向到单独的文件。请参阅我的回答。【参考方案3】:有一种方法可以将中断信号上的 JVM 线程转储输出重定向到带有 LogVMOutput diagnostic option 的单独文件:
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
【讨论】:
从技术上讲,这不会“重定向”线程转储输出。它打开 JVM 日志记录到 jvm.log (包括线程转储输出),但 kill -QUIT 仍将转储到进程的标准输出(以及)。赞成对晦涩的 JVM 选项的描述:)【参考方案4】:在 Java 8 中,jcmd
是首选方法。
jcmd <PID> Thread.print
下面是来自Oracle documentation的sn-p:
JDK 8 的发布引入了 Java Mission Control、Java Flight Recorder 和 jcmd 实用程序,用于诊断 JVM 和 Java 应用程序的问题。 建议使用最新的实用程序 jcmd 而不是以前的 jstack 实用程序,以增强诊断并降低性能开销。
但是,将其与应用程序一起提供可能会涉及许可问题,我不确定。
【讨论】:
不幸的是jcmd
无法使用com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
连接到Windows 服务进程,而jstack -F
成功:***.com/questions/1197912/…
您需要在与 java 进程相同的用户下运行 jcmd 在放置 JVM 标准输出的同一位置。如果您有 Tomcat 服务器,这将是 catalina_(date).out
文件。
【讨论】:
【参考方案6】:当使用 kill -3 时,应该会在标准输出中看到线程转储。大多数应用程序服务器将标准输出写入单独的文件。你应该在使用 kill -3 时找到它。有多种获取线程转储的方法:
kill -3 <PID>
:将输出提供给标准输出。
如果可以访问运行服务器的控制台窗口,则可以使用 Ctrl+Break 组合键在 STDOUT 上生成堆栈跟踪。
对于热点虚拟机,我们还可以使用jstack
命令生成线程转储。它是 JDK 的一部分。语法如下:
Usage:
jstack [-l] <pid> (to connect to running process)
jstack -F [-m] [-l] <pid>(to connect to a hung process)
- For JRockit JVM we can use JRCMD command which comes with JDK Syntax:
jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]
【讨论】:
我在使用 Kill -3kill -3 <PID>
不应该杀死 JVM。您在看什么类型的 Java 应用程序?【参考方案7】:
在 Jboss 中你可以执行以下操作
nohup $JBOSS_HOME/bin/run.sh -c yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null &
kill -3 <java_pid>
这会将您的输出/线程转储重定向到上述命令中指定的文件控制台。
【讨论】:
【参考方案8】:-
查找进程 ID [PS ID]
执行 jcmd [PS ID] Thread.print
【讨论】:
【参考方案9】:如果您想要独立 Java 进程的线程转储,您应该遵循的步骤
第 1 步:获取调用 java 程序的 shell 脚本的进程 ID
linux$ ps -aef | grep "runABCD"
user1 **8535** 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17796 17372 0 08:15:41 pts/49 0:00 grep runABCD
步骤 2: 获取由 runABCD 调用的子进程 ID。使用上面的 PID 来获取孩子。
linux$ ps -aef | grep **8535**
user1 **8536** 8535 0 Mar 25 ? 126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer
user1 8535 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17977 17372 0 08:15:49 pts/49 0:00 grep 8535
第 3 步: 获取特定进程的 JSTACK。获取 XYSServer 进程的进程 ID。即 8536
linux$ jstack **8536** > threadDump.log
【讨论】:
以上是关于unix kill命令的主要内容,如果未能解决你的问题,请参考以下文章