- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 POSIX 系统上,终止信号通常具有以下顺序(根据许多 MAN 页面和 POSIX 规范):
SIGTERM - 礼貌地要求进程终止。它应该优雅地终止,清理所有资源(文件、套接字、子进程等),删除临时文件等等。
SIGQUIT - 更有力的请求。它将不优雅地终止,仍然清理绝对需要清理的资源,但可能不会删除临时文件,可能会在某处写入调试信息;在某些系统上,还会写入核心转储(无论信号是否被应用捕获)。
SIGKILL - 最有力的请求。该进程甚至没有被要求做任何事情,但系统会清理该进程,不管它是否喜欢。很可能已写入核心转储。
SIGINT
是如何融入这张图片的?当用户点击 CRTL+C
时,CLI 进程通常由 SIGINT
终止,但是后台进程也可以由 SIGINT
使用 终止>KILL
实用程序。我在规范或头文件中看不到的是,如果 SIGINT
或多或少比 SIGTERM
更有力,或者 SIGINT
之间是否有任何区别和 SIGTERM
。
更新:
到目前为止,我发现的对终止信号的最佳描述在 GNU LibC Documentation 中。 .它很好地解释了 SIGTERM 和 SIGQUIT 之间存在预期差异。
上面写着SIGTERM
:
It is the normal way to politely ask a program to terminate.
它说的是SIGQUIT
:
[...] and produces a core dump when it terminates the process, just like a program error signal.You can think of this as a program error condition “detected” by the user. [...]Certain kinds of cleanups are best omitted in handling SIGQUIT. For example, if the programcreates temporary files, it should handle the other termination requests by deleting the temporaryfiles. But it is better for SIGQUIT not to delete them, so that the user can examine them inconjunction with the core dump.
而SIGHUP
也解释得很好。 SIGHUP 并不是真正的终止信号,它只是意味着与用户的“连接”已经丢失,因此应用程序不能期望用户读取任何进一步的输出(例如 stdout/stderr 输出),并且没有期望从用户不再。对于大多数应用程序来说,这意味着他们最好退出。理论上,应用程序也可以在收到 SIGHUP 时决定进入守护程序模式,现在作为后台进程运行,将输出写入配置的日志文件。对于已经在后台运行的大多数守护进程,SIGHUP 通常意味着它们将重新检查其配置文件,因此您在编辑配置文件后将其发送到后台进程。
然而,这个页面上没有关于 SIGINT 的有用解释,除了它是由 CRTL+C 发送的。有什么理由可以以与 SIGTERM 不同的方式处理 SIGINT 吗?如果是这样,这是什么原因,处理方式有何不同?
最佳答案
SIGTERM
和 SIGKILL
用于一般用途的“终止此进程” 请求。 SIGTERM
(默认)和 SIGKILL
(总是)会导致进程终止。 SIGTERM
可能被进程捕获(例如,如果它愿意,它可以自己进行清理),甚至完全忽略;但是 SIGKILL
不能被捕获或忽略。
SIGINT
和 SIGQUIT
专门用于来自终端的请求:可以分配特定的输入字符来生成这些信号(取决于终端控制设置)。 SIGINT
的默认操作与 SIGTERM
的默认操作相同类型的进程终止和 SIGKILL
的不可更改的操作; SIGQUIT
的默认操作也是进程终止,但可能会发生其他实现定义的操作,例如生成核心转储。如果需要,可以被进程捕获或忽略。
SIGHUP
,正如您所说,旨在表明终端连接已丢失,而不是作为终止信号。但是,SIGHUP
的默认操作也是如此。 (如果进程没有捕获或忽略它)就是以与SIGTERM
相同的方式终止进程等等。
POSIX 中有一个表 signal.h
的定义其中列出了各种信号及其默认操作和目的,以及 General Terminal Interface本章包含有关终端相关信号的更多详细信息。
关于linux - SIGINT 与 SIGTERM、SIGQUIT 和 SIGKILL 等其他终止信号有何关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4042201/
当前在我的 Windows 机器上使用 Codeception 运行 PHPUnit 时出现错误: [PHPUnit_Framework_Exception] Use of undefined con
当我的 Dockerfile 以 结尾时 CMD node . docker 使用命令 /bin/sh -c "node ." 运行该容器而不是简单的 node . (我知道,我可以用 CMD ["n
在Airflow v2.6.3上,我每天运行Spark作业。每隔一段时间,DAG中的成功作业都会通过EMR传感器重试该作业。重试的作业将显示“此实例的状态已在外部设置为up_for_retry。正在终
$ cat SIGTERM #!/bin/bash set -eu flag_file=$(xdg-user-dir DESKTOP)/SIGTERM-TRAPPED trap 'touch "$fl
我有一个单线程进程,它不会因 kill -TERM 而死亡。过程 信号掩码不显示 SIGTERM 被阻止。我正在执行“杀死” 根。我可以使用 SIGKILL 终止进程,但这是更大范围的一部分 系统,我
我有一个 bash 脚本调用 run.sh启动多个进程 #!/bin/bash proc1 & proc2 & proc3 & final # this runs until sigterm 当我执行
我正在摆弄多处理和信号。我正在创建一个池,并让工作人员捕获 SIGTERM。没有明显的原因,我观察到子进程随机接收 SIGTERM 。这是一个 MWE: import multiprocessing
Java 有没有办法处理接收到的 SIGTERM? 我正在运行一个 java 服务,但不想在用户注销时关闭我的 java 服务。 只想覆盖 sigterm 关闭处理程序,但保留其余信号的处理程序。 d
操作系统 (Linux) 可以向进程发送 SIGTERM 吗?如果是,什么时候?在什么情况下?例如,当我的进程写入不正确的地址内存时,操作系统会向它发送 SIGSEGV。提前致谢 最佳答案 Can O
我正在 try catch SIGTERM 信号并在来自 Linux 守护进程的处理程序中打印一条消息: void SigStop_Handler(int sig) { D(printf("**
我有一个简单的守护进程可以归结为 #include #include #include #include #include #include bool running = true; st
Java中有没有办法处理收到的SIGTERM? 我正在运行 java 服务,但不想在用户注销时关闭我的 java 服务。 只想覆盖 sigterm 关闭处理程序,但保留其余信号的处理程序。 detai
我有一个通过响应信号来运行的 C 程序。一些信号导致父进程 fork 。这允许在父级继续响应信号的同时进行其他处理。 当父级收到 SIGTERM 时,我希望 fork 的子级也收到 SIGTERM。在
我正在做这样的事情 def exitHandler(self, *args): self.stopThreads() sys.exit(2) 然后我在我的 self.run 中注册了该
我用c设计了一个消息传递接口(interface),用于在我的系统中运行的不同进程之间提供通信。该接口(interface)为此目的创建 10-12 个线程,并使用 TCP 套接字提供通信。 它工作正
我有一个可以启动和关闭进程的类。但似乎并没有关闭该进程。 我的python代码,还有其他方法,但它们工作得很好。: class KismetInstance: """Creates a kis
我的守护进程(仅限 Linux)具有以下信号处理程序: static void signal_handler(int id, siginfo_t *si, void *context) { i
有一个守护进程有两个线程:th1,th2。 th2 使用 read(2) 读取套接字。 如果我用 SIGTERM 终止守护进程,th1 会捕获并处理信号(设置终止标志),在调用守护进程析构函数之后,它
我的程序如下: #include #include #include #include int main() { struct sigaction new_sa; struct
如果 Python 接收到 SIGTERM 但没有为其注册信号处理程序,默认情况下会在幕后做什么? 最佳答案 基于 Thomas Wouters 的回答,python 没有为 SIGTERM 信号注册
我是一名优秀的程序员,十分优秀!