我常常感到困惑的是,尽管我从事计算机专业工作几十年,Linux 工作十年,但我实际上将操作系统的大部分功能视为黑匣子,与魔术没什么两样。
今天我想到了这个kill
命令,虽然我每天多次使用它(无论是“正常”还是-9
风格),我必须承认我完全不知道它在幕后是如何工作的。
在我看来,如果一个正在运行的进程被“挂起”,我会调用kill
它的 PID,然后它突然不再运行了。魔法!
那里到底发生了什么?联机帮助页谈论“信号”,但这肯定只是一种抽象。发送kill -9
到进程不需要进程的合作(如处理信号),它只是将其杀死。
我真的很想知道这一切!
当一个进程被一个可处理的信号杀死时,例如SIGINT
orSIGTERM
但它不处理该信号,该进程的退出代码是什么?
对于无法处理的信号,例如SIGKILL
?
据我所知,杀死进程SIGINT
可能会导致退出代码130
,但这会因内核或外壳实现而异吗?
$ cat myScript
#!/bin/bash
sleep 5
$ ./myScript
<ctrl-c here>
$ echo $?
130
Run Code Online (Sandbox Code Playgroud)
我不确定如何测试其他信号...
$ ./myScript &
$ killall myScript
$ echo $?
0 # duh, that's the exit code of killall
$ killall -9 myScript
$ echo $?
0 # same problem
Run Code Online (Sandbox Code Playgroud) 如果程序不允许处理或忽略 SIGKILL 和 SIGSTOP,并且必须立即终止,为什么内核还要向程序发送信号?内核不能简单地从 CPU 和内存中驱逐程序吗?我假设内核有能力直接做到这一点。
突然断电和SIGKILL在运行程序上有什么区别?
我们有使用数据库的微服务。我的任务是创建模拟突然断电的自动测试(不是很好的关机,而是在没有 UPS 的情况下拔掉电源)。意图是在重新启动后,我们要验证数据库是否仍然一致等。我计划使用killall -9 microservice_name
. 这个模拟有多好?做一个或另一个更具破坏性吗?我特别担心刷新(或不刷新)文件缓冲区,但也许还有其他区别?
额外问题:当我们与不是实际功率,而是虚拟机的突然杀死相比时会怎样?