kill、killall、pkill

一、kill命令

kill命令用于向指定进程发送指定的信号。预设的信号是SIGTERM(15),可以将指定程序终止。如果无法终止该程序,可以使用SIGKILL(9)信息尝试强制删除程序。

kill命令的语法为:

bash 复制代码
kill [options] <pid> [...]
options表示可选参数,<pid>表示进程或作业识别号。可以指定多个<pid>,以空格分隔。
kill命令有以下选项:

-a:当处理当前进程时,不限制命令名和进程号的对应关系。
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称。
-p:指定kill命令只打印相关进程的进程号,而不发送任何信号。
-s <信息名称或编号>:指定要送出的信息。
-u <用户>:指定用户。

注意:kill命令是依靠PID来确定进程的,所以kill命令只能识别PID,而不能识别进程名。

kill命令常用信号及其含义

bash 复制代码
1) SIGHUP 重载配置
2) SIGINT 等同于Ctrl+C
3) SIGQUIT 处理完当前任务,优雅退出
9) SIGKILL 强制退出
10) SIGUSR1 重新生成日志文件
12) SIGUSR2 启动新的master进程,此时新老master进程并存
15) SIGTERM 正常结束,缺省信号,不填写即默认
18) SIGCONT 继续进程
19) SIGSTOP 停止进程
20) SIGTSTP 暂停进程,等同于Ctrl+Z
28) SIGWINCH 逐步关闭工作子进程,保留master

需要注意,各个信号的前缀SIG可以省略,也就是说SIGHUP等同于HUP,SIGTERM等同于TERM,两种写法都可以,kill命令都可以理解。

kill命令与nginx中的命令放在一起更容易理解

①停止nginx服务

bash 复制代码
nginx -s stop 
-s 参数是nginx程序向正在运行nginx服务发送信号,nginx程序会通过nginx.pid文件得到master进程的PID,再向运行中的master进程发送SIGTERM信号来关闭服务。

所以直接向nginx的master进程发送SIGTREM或SIGINT信号也是可以的
kill -s SIGTREM $(pidof nginx) 立即停止程序 -> 释放相应资源后终止程序
或
kill -s SIGINT $(pidof nginx)

②优雅停止服务

nginx服务正常处理完当前所有请求后再停止服务,终止程序,注意与SIGTREM的逻辑

bash 复制代码
nginx -s quit
或
kill -s SIGQUIT $(pidof nginx)

③重载配置项

使用于nginx配置文件修改后,需要重新加载配置项

bash 复制代码
nginx -s reload
或
kill -s SIGHUP $(pidof nginx)

④正确备份日志的步骤

bash 复制代码
步骤1:备份日志文件 mv access.log access.log-时间戳
步骤2:nginx -s reopen # 重新生成新的空的日志文件
			或 kill -s SIGUSR1 $(pidof nginx)
步骤3:删除超出保留时间的旧日志

⑤平滑升级Nginx

bash 复制代码
1 备份原nginx二进制文件,替换nginx文件
2 向master进程发送平滑迁移信号,执行这个命令后,新老master进程并存
kill -s SIGUSR2 `cat /usr/local/nginx/logs/nginx.pid`
此时nginx的pid文件会被备份重命名为nginx.pdi.oldbin
3 旧的worker子进程退出,不停止老的master进程是方便回滚
kill -s SIGWINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
4 没有问题,结束老版本master进程,完成升级
kill -s SIGQUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
5 回滚情形,向老的master进程发送HUP,向新的master发送QUIT

二、killall命令

killall是一个用于发送信号给同名进程的命令。它可以根据进程名称来标识要发送信号的进程,可以用来杀死所有同名进程。

bash 复制代码
Usage: killall [-Z 上下文] [-u 用户名] [ -eIgiqrvw ] [ -信号 ] 程序名...
       killall -l, --list
       killall -V, --version
       
-e --exact:要求完全匹配非常长的名称。
-I --ignore-case:忽略大小写进行进程名称匹配。
-g --process-group:杀死进程组而不是进程。
-y --younger-than:杀死比指定时间年轻的进程。
-o --older-than:杀死比指定时间年长的进程。
-i --interactive:在杀死进程前询问确认。
-l --list:列出所有已知的信号名称。
-q --quiet:不打印投诉信息。
-r --regexp:将NAME解释为扩展正则表达式。
-s --signal SIGNAL:发送这个信号代替SIGTERM。
-u --user USER:只杀死以USER身份运行的进程。
-v --verbose:报告信号是否成功发送。
-V --version:显示版本信息。
-w --wait:等待进程死亡。
-Z,--context 正则表达式 仅杀死含有指定上下文的进程
                          (必须在其他参数前使用)

例如,killall -9 nginx会向所有名为nginx的进程发送SIGKILL信号,而killall -s SIGUSR2 nginx则会向所有名为nginx的进程发送SIGUSR2信号。

三、pkill命令

pkill命令用于发送信号给匹配特定模式的进程。它是ps命令和kill命令的结合,可以根据进程名来杀死指定进程。

以下是pkill命令的详细解释:

bash 复制代码
语法:pkill(选项)(参数)
选项:
-c ctidlist:仅匹配列表中列出的ID的进程。
-d delim:指定每一个匹配的进程ID之间分割字符串。如果没有-d选项指定,默认的是新行字符。
-g pgrplist:仅匹配进程组ID在给定列表中的进程。如果组0包括在列表中,这个被解释为pgrep或者pkill进程的组ID。每一个组ID可以使用组名称或者数字的组ID指定。
-l选项:仅在pgrep命令中有效。
参数:pkill命令的参数是用于匹配进程的模式,可以是进程名称、PID等。

例如,pkill -SIGTERM nginx会向所有名为nginx的进程发送SIGTERM信号。

相关推荐
布局呆星8 小时前
云服务器上部署单项目/多项目
运维·服务器
盐焗鹌鹑蛋8 小时前
【Linux】缓冲区
linux·运维·服务器
ltl10 小时前
向量库与图 RAG:HNSW、DiskANN 到 GraphRAG
linux
严谨的麻辣烫10 小时前
数据中心出口与住宅出口的技术差异:从 ASN 到 TCP 行为的一次拆解
网络·网络协议·tcp/ip
Freed&11 小时前
Zabbix TCP连接状态自定义监控完整部署手册
网络·tcp/ip·zabbix
学着改变27511 小时前
手持式超声波流量计为何首选行澳科技?便携巡检与外夹计量的性能标杆
大数据·网络·人工智能·科技·产品运营·量子计算
学代码的CJY11 小时前
Linux 库制作与原理:静态库、动态库、ELF 与动态链接完全指南
linux·运维·服务器
沸速存储12 小时前
CPU 和 GPU 核心差别在哪?为什么 AI 训练离不开 GPU
服务器·人工智能·科技·嵌入式硬件·电脑
2501_9159214312 小时前
抓包鹰 Traceeagle 解除证书绑定,SSL Pinning 解除
网络·网络协议·网络安全·ios·adb·https·ssl
Lucky_Turtle12 小时前
【SSL】letsencrypt域名证书申请,Cloudflare域名
网络·网络协议·ssl