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信号。

相关推荐
lixzest1 小时前
Vim 快捷键速查表
linux·编辑器·vim
ICscholar7 小时前
ExaDigiT/RAPS
linux·服务器·ubuntu·系统架构·运维开发
sim20207 小时前
systemctl isolate graphical.target命令不能随便敲
linux·mysql
薛定谔的猫19828 小时前
RAG(二)基于 LangChain+FAISS + 通义千问搭建轻量级 RAG 检索增强生成系统
运维·服务器·langchain
米高梅狮子8 小时前
4. Linux 进程调度管理
linux·运维·服务器
再创世纪9 小时前
让USB打印机变网络打印机,秀才USB打印服务器
linux·运维·网络
fengyehongWorld9 小时前
Linux ssh端口转发
linux·ssh
知识分享小能手11 小时前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的Shell编程详细知识点(含案例代码)(17)
linux·学习·ubuntu
yugi98783811 小时前
异构网络下信道环境建模方法及应用
开发语言·网络
浩子智控11 小时前
电子产品设计企业知识管理
运维·服务器·eclipse·系统安全·硬件工程