为什么SIGTERM不能杀死Linux中的一些进程?

问题描述 投票:0回答:1

kill -15 chrome 在正常情况下可以使用。为什么有时这个命令不能工作?程序到底发生了什么,系统到底发生了什么,使得 kill -15 chrome 无法工作?

我读到SIGTERM可以被 "阻止"、"忽略 "和 "处理"?这3个词到底是什么意思,这3种情况下到底发生了什么?这和谷歌浏览器不停止的例子之间有什么关系?

谢谢您

linux unix kill kill-process sigterm
1个回答
0
投票

SIGTERM用来通知一个进程必须停止执行,然后进程决定怎么做,通常是清理资源,和平地停止执行,所以这3种情况由进程开发者决定。

如果你想杀死一个进程,无论如何,你都要使用SIGKILL kill -9 甚至没有传递给正在运行的进程。


0
投票

Linux中的信号处理是通过系统调用的glibc库 "暗中 "完成的。根据 gnu库文件:

SIGTERM信号是一个通用信号,用于引起程序终止。与SIGKILL不同的是,这个信号可以被阻止、处理和忽略。它是礼貌地要求程序终止的正常方式。

我将尝试定义这些术语 受阻, 处理漠视 以下(代码示例不包括错误处理,所以要注意)。

受阻: 在Linux中运行的每个进程在进程创建时都会被赋予一个信号掩码。进程创建时,会给每个进程一个信号掩码。sigprocmask 函数调用可以用来阻断或解阻信号--被阻断的信号会被排成队列,以便以后在进程解阻时可以处理它们。例如,使用标准的信号相关的系统调用(摘自Michael Kerrisk所著的《Linux编程接口》)来屏蔽SIGTERM--。

    sigset_t blockSet, savedSigMask;
    sigemptyset(&blockSet); /* initialize empty */
    sigaddset(&blockSet, SIGTERM);
    sigprocmask(SIG_BLOCK, &blockSet, &savedSigMask);

/* process will not be interrupted by SIGTERM, which can be restored later*/

忽略: 同样,信号可以通过sigaction系统调用和SIG_IGN标志被忽略,即进程在收到信号时不会被打断,信号也不会被排队--通过系统调用 诉讼:

struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NODEFER; /* Dont block the signal when it's handler is running */
sigaction(SIGTERM, &sa, NULL);

已处理:sigaction也可以用来定义一个在接收到信号时被调用的函数。这算是接收SIGTERM的最佳实践,让你的进程优雅地关闭。

struct sigaction sa;
sa.sa_sigaction = functionp; /* functionp is your handler function */
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NODEFER | SA_SIGINFO;
sigaction(signo, &sa, NULL; 

你可以为SIGTERM使用一个信号处理程序,这样它就不会导致你的进程退出,但这通常不是SIGTERM处理程序的用途。另外需要注意的是,在运行 systemd如果程序接收到SIGTERM后没有退出,systemd会向其发送KILL信号,所以为了防止这种情况,systemd必须配置为允许进程忽略SIGTERM。

© www.soinside.com 2019 - 2024. All rights reserved.