杀掉线程kill -9和kill -15的区别

本文详细解析了Linux系统中SIGTERM和SIGKILL信号的作用及区别,探讨了它们在进程管理中的应用,特别是在终止tomcat服务器时的实践。

在部署tomcat,有时候使用shutdown.sh关闭线程会失败,很多人都会使用的套路:

ps -ef|grep java
kill -9 pid 或者 kill -15 pid

ps -ef|grep tomcat
kill -9 pid 或者 kill -15 pid

现在来了解一下这个kill命令。

1)kill

从help中可以清晰的看到 -n 指的是 信号编号,那问题来了,“信号编号”是哪位大神???

2)kill -l(查看Linux/Unix的信号变量)

这么多呀!! 今天就单独说一下SIGKILLSIGTERM

3)(kill pid) 、( kill -15 pid)

系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该signal后,将会发生以下的事情

  1. 程序立刻停止
  2. 当程序释放相应资源后再停止
  3. 程序可能仍然继续运行

      大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以

      配置的。如果程序正在等待IO,可能就不会立马做出相应。

  也就是说,SIGTERM多半是会被阻塞的、忽略。

4)kill  -9 pid

你不是可以不响应 SIGTERM吗??那好,我给你下一道必杀令,我看你还不乖乖的。多半admin会用这个命令

不过,也不是所有的程序都会乖乖听话,总有那些状态下的程序无法立刻相应。

 

附录:

linux signals

Signal NameNumberDescription
SIGHUP1Hangup (POSIX)
SIGINT2Terminal interrupt (ANSI)
SIGQUIT3Terminal quit (POSIX)
SIGILL4Illegal instruction (ANSI)
SIGTRAP5Trace trap (POSIX)
SIGIOT6IOT Trap (4.2 BSD)
SIGBUS7BUS error (4.2 BSD)
SIGFPE8Floating point exception (ANSI)
SIGKILL9Kill(can't be caught or ignored) (POSIX)
SIGUSR110User defined signal 1 (POSIX)
SIGSEGV11Invalid memory segment access (ANSI)
SIGUSR212User defined signal 2 (POSIX)
SIGPIPE13Write on a pipe with no reader, Broken pipe (POSIX)
SIGALRM14Alarm clock (POSIX)
SIGTERM15Termination (ANSI)
SIGSTKFLT16Stack fault
SIGCHLD17Child process has stopped or exited, changed (POSIX)
SIGCONT18Continue executing, if stopped (POSIX)
SIGSTOP19Stop executing(can't be caught or ignored) (POSIX)
SIGTSTP20Terminal stop signal (POSIX)
SIGTTIN21Background process trying to read, from TTY (POSIX)
SIGTTOU22Background process trying to write, to TTY (POSIX)
SIGURG23Urgent condition on socket (4.2 BSD)
SIGXCPU24CPU limit exceeded (4.2 BSD)
SIGXFSZ25File size limit exceeded (4.2 BSD)
SIGVTALRM26Virtual alarm clock (4.2 BSD)
SIGPROF27Profiling alarm clock (4.2 BSD)
SIGWINCH28Window size change (4.3 BSD, Sun)
SIGIO29I/O now possible (4.2 BSD)
SIGPWR30Power failure restart (System V)

参考文献

https://major.io/2010/03/18/sigterm-vs-sigkill/
http://blog.youkuaiyun.com/ashlingr/article/details/8057825
http://www.comptechdoc.org/os/linux/programming/linux_pgsignals.html

### 如何使用 `nvidia-smi` `kill -9` 终止指定 GPU 的进程 在处理 GPU 占用问题时,可以结合 `nvidia-smi` 工具来识别并终止特定的 GPU 进程。以下是具体方法: #### 使用 `nvidia-smi` 查找 GPU 上的进程 `nvidia-smi` 是 NVIDIA 提供的一个工具,用于监控管理 GPU 资源。可以通过以下命令获取当前正在使用的 GPU 及其对应的进程 ID (PID) 列表: ```bash nvidia-smi ``` 该命令会显示 GPU 当前的状态以及哪些进程正在占用它。如果发现某些进程不需要继续运行,则记录下它们的 PID。 #### 手动杀死单个进程 对于已知的某个具体的 PID,可以直接通过 `kill -9` 命令强制结束此进程: ```bash kill -9 <pid> ``` #### 自动化批量杀掉所有相关进程 当存在多个需要清理的进程时,手动操作效率较低。此时可利用脚本实现自动化清除功能。下面是一条能够一次性删除所有与目标设备有关联的所有活动线程的一行式解决方案: ```bash fuser -v /dev/nvidia* | awk &#39;{for(i=1;i<=NF;i++) print "kill -9 ", $i}&#39; | bash ``` 这条指令的工作原理如下: - **`fuser -v /dev/nvidia*`**: 显示正访问 `/dev/nvidia*` 设备文件的所有 PIDs。 - **`awk &#39;{for(i=1;i<=NF;i++) print "kill -9 ", $i}&#39;`**: 遍历每一个字段(即每个 PID),构建出相应的 `kill -9` 命令字符串。 - **`bash`**: 将前面生成的所有 `kill -9` 指令逐一执行。 另外一种方式则是基于用户名筛选对应用户的全部作业项再统一销毁之: ```bash pgrep -u username | xargs kill -9 ``` 这里需要注意替换实际登录系统的账户名至上述位置处完成适配调整[^2]。 以上两种方案均能有效应对多数量级规模下的资源回收需求场景。 #### 特殊情况说明 有时即使看不到任何明确标记出来的应用层面上的任务实体仍然可能存在隐匿型后台服务持续霸占着硬件计算单元的情况发生;这可能是由于之前错误地采用了 Ctrl+Z 键组合暂停而非真正意义上的停止某段长时间运算逻辑所引发的结果所致——这种情形下务必记得改回采用标准中断信号 Ctrl+C 来即时打断正在进行中的流程以免遗留下来不必要的负担影响后续正常使用体验效果[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值