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

相关推荐
认真学习的小雅兰.1 分钟前
如何在Ubuntu上利用Docker和Cpolar实现Excalidraw公网访问高效绘图——“cpolar内网穿透”
linux·ubuntu·docker
zhou周大哥16 分钟前
linux 安装 ffmpeg 视频转换
linux·运维·服务器
Sun_12_225 分钟前
SQL注入(SQL lnjection Base)21
网络·数据库
不想起昵称92943 分钟前
Linux SHELL脚本中的变量与运算
linux
loong_XL1 小时前
服务器ip:port服务用nginx 域名代理
服务器·tcp/ip·nginx
夕泠爱吃糖1 小时前
C++中如何实现序列化和反序列化?
服务器·数据库·c++
网络安全Jack1 小时前
网络安全概论——身份认证
网络·数据库·web安全
易我数据恢复大师1 小时前
如何彻底删除电脑数据以防止隐私泄露
网络·电脑·数据删除·擦除
the丶only1 小时前
单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
linux·运维·服务器·docker·gitlab