linux系列之:告诉他,他根本不懂kill
nanshan 2024-10-26 11:08 10 浏览 0 评论
简介
和很多程序员打过交道,这些程序员可能熟知for遍历的好几种写法,但是却对写出来的程序部署的环境一无所知。我敢打赌,在spring boot出现之后,已经很少有程序员知道tomcat到底是怎么运行的了。对于他们来说,运行一个jar包就完事了。
工具的先进性确实带给我们很多便利,也提升了程序员的开发效率,同时也降低了程序员的进入门槛。今天想和大家一起讨论一下,linux中的kill命令到底是做什么用的。
可能很很多小伙伴第一次接触kill命令是同事告诉他,把进程kill掉。那么kill真的是用来杀进程的吗?
使用kill来杀死进程
先来看一个kill最基本,也是最常见的应用就是杀死进程。在杀死进程之前,我们需要找到这个进程ID。
一般情况下是使用ps命令找到这个进程ID。加入这个进程ID=54321。
那么接下来就可以使用kill 54321来杀死这个进程了。
更资深一点的同学,可能还会使用kill -9 54321来强制杀死这个进程。
有没有更深入的用法呢?有的,一起来看看。
kill的深入用法
先看一下kill的命令参数到底有那些:
kill
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
可以看到kill的参数是sig,也就是信号。也就是说kill的本质是向程序传递信号的。
如果使用 kill -l ,我们可以得到到底kill可以传递多少信号:
kill -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
16) SIGSTKFLT 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
总共64个信号,可能不同的kill版本,信号有所不同,但是基本上都覆盖了常用的信号。
下面是一些常用信号的含义:
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)
怎么看kill的版本呢?
/bin/kill --version
kill from util-linux 2.23.2
如果kill不传sig,那么将会传默认的sig=TERM,也就是15。所以上面的kill 54321和 kill -15 54321是等价的。
一般情况下,我们优先使用SIGTERM信号。这是因为当程序收到了SIGTERM信号之后,会做一些程序的清理操作,或者说是优雅的关闭。
如果传入kill -9 也就是SIGKILL,那么应用程序将无法捕捉这个信号,从而导致程序强制被关闭,有可能会照成一些异常情况,比如数据还没有保存,数据传输还没有结束等等。
sig还有一个特殊值叫做0,如果传入0的话,那么并不会发送实际的信号,这个只是做异常检测用的。
pid就是process id,可以理解为是进程号。除了进程号之外,还可以传入一些特殊值,比如:
- 0 表示当前进程group的所有进程
- -1 表示所有PID>1的进程
还有一个特殊的pid=1,这个pid表示的是初始进程init,这个进程是不可被杀死的。
除了PID之外,我们看到kill还可以接受jobspec。job id可以使用jobs命令来列出。
僵尸进程和kill
上面讲到了pid=1的初始进程是不能被kill的。还有一种不能被kill的进程叫做僵尸进程。
僵尸进程是linux程序中一个非常独特的状态,它表示的是进程已经结束了,但是又还没有完全死亡,就像僵尸一样。
linux中的5大进程状态分别是:RUNNING:正在运行或等待运行状态,UNINTERRUPTABLE:不可中断阻塞状态,INTERRUPTABLE:可中断阻塞状态,STOPPED:挂起状态和ZOMBIE:僵尸状态。
那么什么是僵尸进程呢?
僵尸进程指的是程序在退出之后,该进程并不是马上消失的,而是会保留一个被称为僵尸的数据结构。这个数据结构很特殊,因为其没有内存空间,没有可执行的代码,当然也不可以被调度。它只是在进程列表中占有一个位置,记录了该进程退出时候的各种信息。
僵尸进程主要是保留进程退出的现场,供父进程或者系统管理员进行分析使用的,所以僵尸进程是交由父进程来进行收集和释放的。因为僵尸进程已经退出了,所以使用kill是没有用的,只能等待其父进程退出,才能真正的退出。
怎么查看僵尸进程呢?最简单的方法就是使用top命令:
top - 14:34:38 up 305 days, 4:23, 2 users, load average: 0.20, 0.29, 0.47
Tasks: 93 total, 1 running, 92 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.0 us, 0.7 sy, 0.0 ni, 97.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1882008 total, 525524 free, 311440 used, 1045044 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1382560 avail Mem
上面的输出,我们可以看到里面有0个zombie。
java thread dump
kill还有一个非常有用的地方就是生成java程序的thread dump,将当前java程序的线程信息dump出来,可以进行一些有用的分析,比如死锁分析等。
怎么对java进程做thread dump呢?很简单使用kill -3 命令即可:
kill -3 <pid>
从上面我们的介绍可以指定3代表的信号是SIGQUIT。这说明JVM内置了这个信号的捕捉,如果接收到了这个信号,则会dump当前的线程信息。
java thread dump在对java进行线程分析的时候非常有用。
总结
本文介绍了kill的深入用法和底层的工作原理,还介绍了kill的几个应用,希望下次有人再问你kill到底是什么的时候,大家都可以很自豪的告诉他!
本文已收录于 http://www.flydean.com/01-that-is-kill/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
相关推荐
- ssh终端xshell日志查看命令(xshell怎么看日志)
-
现在我们云服务器运维较多用的是SSH工具,其中常用的包括PUTTY、XSHELL等,其实大同小异界面UI稍微不同,但是都可以进入远程连接。这里有朋友提到如何查看服务器的日志文件,这个其实和是否使用XS...
- 使用 Fail Ban 日志分析 SSH 攻击行为
-
通过分析`fail2ban`日志可以识别和应对SSH暴力破解等攻击行为。以下是详细的操作流程和关键分析方法:---###**一、Fail2ban日志位置**Fail2ban的日志路径因系统配置...
- 如何高效读取Linux日志文件?这些命令要熟记于心!
-
在Linux系统中,日志文件通常存储在/var/log目录下。比如,/var/log/syslog(或/var/log/messages,视发行版而定)记录系统整体事件,/var/log/a...
- Windows服务器远程登录日志查询方法,linux查看登录日志方法
-
概述本文介绍Windows、Linux服务器查询系统的远程登录日志方法。根据服务器所使用的操作系统不同,有以下两种查询方法。Linux操作系统的登录日志查询通过远程连接登录Linux服务器,使用roo...
- iptables防火墙如何记录日志(防火墙日志查看)
-
例如:记录所有ssh服务的登录的日志首先,我们需要了解如何将所有的iptables的INPUT链数据包记录到/var/log/messages中。如果你已经有一些iptables规则了,那么将记录日志...
- 如何安全管理SSH密钥以防止服务器被入侵
-
SSH密钥安全管理实施指南(2025年更新版)一、密钥生成与存储规范高强度密钥生成bashCopyCodessh-keygen-ted25519-a100#生成ED25519算法密钥(比...
- 在CentOS上安装nginx服务器(centos搭建代理服务器)
-
一、环境描述1.虚拟机配置CPU:单核内存:2GB硬盘:120GBIP:10.24.17.1082.操作系统版本:CentOS6.6x86_64安装方式:Minimal3.虚拟化环境VM...
- CentOS7安全加固的一份整理规划建议
-
◆更新系统:及时更新CentOS7操作系统版本和安全补丁,确保系统以最新状态运行。◆关闭不必要的服务:在运行系统时,应关闭不需要的服务和端口,以减少系统暴露的攻击面。◆安装防火墙:使用iptables...
- 第四十七天-二叉树,centOS安装tomcat,Maven,vsftpd
-
学习笔记:1.Maven是Apache下的一个纯Java开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven...
- Linux远程桌面连接使用教程 Widows终端远程连接Linux服务器
-
一、前言为什么不是远程连接Linux服务器?因为我不会,远程连接window我就用电脑自带的“远程桌面连接”。以下所述都是在CentOS操作系统下的。服务器刚换成Linux的时候很迷茫,感觉无从下手...
- CentOS 安全加固操作,保护你的操作系统
-
系统加固是保障系统安全的重要手段,对于维护企业数据安全、用户隐私以及系统稳定运行具有重要意义。加固后的系统更加健壮和稳定,能够有效减少因安全问题导致的系统故障和停机时间,提高系统的可用性和可靠性。通过...
- Dockerfile部署Java项目(docker如何部署java项目)
-
1、概述本文主要会简单介绍什么是Docker,什么是Dockerfile,如何安装Docker,Dockerfile如何编写,如何通过Dockerfile安装jar包并外置yaml文件以及如何通过do...
- CentOS7云主机部署Fail2ban阻断SSH暴力破解
-
关于Fail2banFail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽)例如:当有人在试探你的HTTP、SSH、SMTP、FTP密...
- 在CentOS7上用源码编译安装PostgreSQL
-
1、新建postgres用户#useraddpostgres&&passwdpostgres2、安装依赖包#yum-yinstallmakegccgcc-c++readline...
- pure-ftpd 使用(ftp prompt命令)
-
pure-ftpd是一个免费的ftp软件,其他介绍就不多说了。我们直接开始主题安装centosyuminstallepel-releaseyuminstallpure-ftpd配置备份原配置...
你 发表评论:
欢迎- 一周热门
-
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WindowsServer2022|配置NTP服务器的命令
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
K3s禁用Service Load Balancer,解决获取浏览器IP不正确问题
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)