kill 命令你真的理解了吗 ?

绝大多数人对 kill 命令的理解就是结束一个进程,除了这个 kill 其实还有其它的功能。

kill 的作用是向一个进程发送指定信号,而不仅仅是结束一个进程哦!

接下来让我们详细的看看 kill 的具体功能。

一、常用参数

语法格式:

    kill [参数] <进程ID> [...]

常用参数如下:

-l, --list [信号] :列出信号名称;

- , -s, --signal <信号> :指定要发送的信号;

二、实例

2.1 -l 参数

参数后不带信号会列出所有可用信号,如下所示:

linuxy@linuxy:~$ 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
linuxy@linuxy:~$

接下来看下加了信号的情况,如下所示:

linuxy@linuxy:~$ kill -l 9
KILL
linuxy@linuxy:~$ kill -l 8
FPE
linuxy@linuxy:~$

列出了对应信号的名称,但是去掉了前缀 SIG。

-l 参数也可以根据信号名称列出代表的数字,如下所示:

linuxy@linuxy:~$ kill -l 9
KILL
linuxy@linuxy:~$ kill -l KILL
9
linuxy@linuxy:~$ kill -l SIGKILL
9
linuxy@linuxy:~$

2.2 -s 参数

将信号发送给进程,信号可以是名称或数字,我们常用的是直接 “- 信号” 的形式,而很少用 -s 参数。

注意:“-信号”中的信号可以是数字/信号名称/不带前缀SIG的名称

为了进程测试,我们启动了一个程序 kill-test ,进程号为 3756,如下所示:

linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy      3756    2577  0 22:39 pts/1    00:00:00 ./kill-test
linuxy      3769    2577  0 22:40 pts/1    00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$

先尝试不带参数,直接 kill pid,如下所示:

linuxy@linuxy:~$ kill 3756
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy      3756    2577  0 22:39 pts/1    00:00:00 ./kill-test
linuxy      3788    2577  0 22:44 pts/1    00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$

可以看到程序还在,为什么呢?

在不带参数情况下,kill 默认发送 TERM 信号到指定进程,TERM 是终止进程信号,程序没有被结束的原因是程序捕获了该信号,当然,可以杀死不能捕获该信号的进程。

那么,对于第一种情况就需要使用 SIGKILL 信号来强制结束进程,如下所示:

linuxy@linuxy:~$ kill -9 3756
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy      4104    2577  0 22:57 pts/1    00:00:00 grep --color=auto kill-test
[1]+  已杀死               ./kill-test
linuxy@linuxy:~$

以下使用不同的 “-信号” 形式来结束一个进程,下面是不加 SIG 前缀的情况,如下所示:

linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy      4192    4162  0 23:14 pts/2    00:00:00 ./kill-test
linuxy      4199    4162  0 23:14 pts/2    00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$ kill -KILL 4192
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy      4204    4162  0 23:15 pts/2    00:00:00 grep --color=auto kill-test
[1]+  已杀死               ./kill-test
linuxy@linuxy:~$

 下面是添加 SIG 前缀的情况,如下所示:

linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy      4224    4162  0 23:16 pts/2    00:00:00 ./kill-test
linuxy      4228    4162  0 23:16 pts/2    00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$ kill -SIGKILL 4224
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy      4235    4162  0 23:17 pts/2    00:00:00 grep --color=auto kill-test
[1]+  已杀死               ./kill-test
linuxy@linuxy:~$

其它一些常见信号:

SIGHUP :   当 SIGHUP 信号发送给一些守护程序,例如:Apache 和 Sendmail ,在接收到 SIGHUP 信号时会重新读取配置文件;

SIGCHLD : 在一个进程终止或停止时,SIGCHLD 信号被发送给父进程;

SIGCONT : 该信号发送给需要继续运行,但当前处于停止状态的进程;

SIGGIO : 表示一个异步 IO 事件;

SIGSTOP : 这是一个作业控制信号,用于停止一个进程;

注意:除了 SIGKILL 和 SIGSTOP 信号之外,其它的信号都可以被进程所捕获。

三、总结

在我们日常使用过程中,最常用的便是 SIGTERM 和 SIGKILL 信号来结束一个进程,这两个信号的区别是,SIGTERM 信号让程序在结束之前可以做好清理工作,SIGKILL 是强制结束一个进程,该信号不能被捕获或忽略掉,但是要有对应权限哦!其它信号很少在实际操作中使用到。

参考文献:

[1] Ubuntu man 手册

[2] https://en.wikipedia.org/wiki/Kill_(command)

[3] UNIX环境高级编程

 

<think>好的,我需要回答用户关于SIGSTOP信号的问题。首先,我得回忆一下SIGSTOP的定义和用途。记得SIGSTOP是用于暂停进程执行的信号,属于不可捕获和不可忽略的信号,这点可能和SIGKILL类似。用户可能想知道它的工作机制,比如如何发送、进程如何处理。 接下来,我得查阅提供的引用资料。引用[2]提到SIGSTOP不能被捕捉或忽略,这确认了它的不可阻挡性。引用[4]区分了可靠信号和不可靠信号,但SIGSTOP编号可能在1-31之间,属于不可靠信号,但这里更关键的是它的默认行为。引用[2]还提到了sigaction函数,但指出SIGSTOP无法被处理,所以相关函数无法捕获它。 用户可能还想知道如何发送SIGSTOP信号,比如通过kill命令或键盘快捷键。需要说明常用的发送方式,比如kill -SIGSTOP或Ctrl-Z(虽然通常关联的是SIGTSTP,但需要澄清两者的区别)。这里可能需要指出SIGSTOP和SIGTSTP的不同,后者可以被捕获或忽略,而SIGSTOP不能。 另外,工作机制部分需要解释进程收到SIGSTOP后,会进入停止状态,直到收到SIGCONT恢复。这时候进程的状态变为TASK_STOPPED,并且不消耗CPU资源。恢复执行后,进程从停止的地方继续。 应用场景方面,可能涉及调试、资源控制或进程管理。例如,在调试时暂停进程检查状态,或者在系统负载高时暂停非关键进程。 最后,生成相关问题需要考虑用户可能的后续疑问,比如与其他信号的区别,如何恢复进程,以及实际应用中的例子。确保问题覆盖定义、用途、工作机制、发送方式、区别比较和应用场景。</think>### SIGSTOP信号的定义、用途及工作机制 #### 1. **定义** **SIGSTOP** 是 Linux/Unix 系统中的一种标准信号,其编号为 `19`(具体编号可能因系统而异,但通常固定)[^4]。它属于不可靠信号(非实时信号),用于**强制暂停进程的执行**。与 `SIGKILL` 类似,`SIGSTOP` **不能被捕获、忽略或阻塞**,确保进程必须响应[^2][^4]。 --- #### 2. **用途** - **暂停进程**:立即停止目标进程的执行,进入“停止”(`TASK_STOPPED`)状态。 - **调试与调试器交互**:调试工具(如 `gdb`)常用 `SIGSTOP` 暂停进程以检查其状态。 - **资源管理**:在系统负载过高时暂停非关键进程,待资源充足后恢复。 - **进程控制**:配合 `SIGCONT` 信号实现进程的暂停与恢复,例如任务调度。 --- #### 3. **工作机制** 1. **发送方式**: - 命令行:通过 `kill -SIGSTOP <PID>` 或 `kill -19 <PID>`。 - 程序内调用:使用 `kill()` 系统调用发送信号。 - **注意**:`Ctrl+Z` 通常发送的是 `SIGTSTP`(可被捕获),而非 `SIGSTOP`[^2]。 2. **进程响应**: - 进程收到 `SIGSTOP` 后立即停止执行,进入暂停状态,释放 CPU 资源。 - 暂停期间,进程的寄存器状态、内存等被保留,等待 `SIGCONT` 信号恢复。 3. **恢复执行**: - 通过 `kill -SIGCONT <PID>` 发送 `SIGCONT` 信号,进程从停止点继续运行。 --- #### 4. **与其他信号的区别** | 信号 | 是否可捕获 | 默认行为 | 典型用途 | |----------|------------|----------------|------------------------| | `SIGSTOP`| 否 | 强制暂停进程 | 进程控制、调试 | | `SIGTSTP`| 是 | 暂停(可捕获) | 终端交互(如 `Ctrl+Z`)| | `SIGKILL`| 否 | 强制终止进程 | 立即结束进程 | --- #### 5. **应用场景示例** - **调试进程**:调试器发送 `SIGSTOP` 暂停目标进程,检查内存或变量后通过 `SIGCONT` 恢复。 - **批处理任务调度**:系统暂停低优先级进程以优先处理高负载任务。 - **容器编排**:在 Kubernetes 中暂停容器进程以调整资源分配。 --- ###
评论 153
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Muti-Agent

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值