您的系统包含一个手册页,列出了所有可用的信号,但根据您的操作系统,打开方式可能有所不同。 在大多数 Linux 系统上,这将是 man 7 signal。 如有疑问,请使用如下命令找到确切的手册页和章节
man-ksignal | greplist
或
apropos signal | greplist
可以使用 kill -l 找到信号名称。
在没有任何陷阱的情况下,交互式 Bash shell 会忽略 SIGTERM 和 SIGQUIT。 SIGINT 会被捕获和处理,如果作业控制处于活动状态,则 SIGTTIN、SIGTTOU 和 SIGTSTP 也将被忽略。 当通过键盘生成时,作为命令替换结果运行的命令也会忽略这些信号。
默认情况下,SIGHUP 会退出 shell。 交互式 shell 会向所有正在运行或已停止的作业发送 SIGHUP; 如果您想为特定进程禁用此默认行为,请参阅关于 disown 内置命令的文档。 使用huponexit选项,用于在使用 shopt 内置命令接收到 SIGHUP 信号时终止所有作业。
可以使用 Bash shell 发送以下信号
表 12-1. Bash 中的控制信号
标准按键组合 | 含义 |
---|---|
Ctrl+C | 中断信号,向在前台运行的作业发送 SIGINT。 |
Ctrl+Y | 延迟挂起字符。 导致正在运行的进程在尝试从终端读取输入时停止。 控制权返回到 shell,用户可以将进程置于前台、后台或终止进程。 延迟挂起仅在支持此功能的操作系统上可用。 |
Ctrl+Z | 挂起信号,向正在运行的程序发送 SIGTSTP,从而停止它并将控制权返回给 shell。 |
![]() | 终端设置 |
---|---|
检查您的 stty 设置。 如果您正在使用 "现代" 终端仿真,则输出的挂起和恢复通常被禁用。 标准 xterm 默认支持 Ctrl+S 和 Ctrl+Q。 |
大多数现代 shell,包括 Bash,都有一个内置的 kill 函数。 在 Bash 中,信号名称和数字都可用作选项,参数可以是作业或进程 ID。 可以使用以下选项报告退出状态-l选项:当成功发送至少一个信号时为零,如果发生错误则为非零。
使用来自/usr/bin的 kill 命令,您的系统可能会启用额外的选项,例如能够杀死来自您自己用户 ID 之外的进程,以及通过名称指定进程,就像 pgrep 和 pkill 一样。
如果没有给出信号,两个 kill 命令都发送 TERM 信号。
以下是最常见的信号列表
![]() | SIGKILL 和 SIGSTOP |
---|---|
SIGKILL 和 SIGSTOP 无法被捕获、阻止或忽略。 |
当终止一个或一系列进程时,常识是从最不危险的信号 SIGTERM 开始尝试。 这样,关心有序关闭的程序就有机会遵循它们在接收到 SIGTERM 信号时被设计执行的程序,例如清理和关闭打开的文件。 如果您向进程发送 SIGKILL,您将消除进程进行整洁清理和关闭的任何机会,这可能会产生不幸的后果。
但是,如果干净的终止不起作用,则 INT 或 KILL 信号可能是唯一的方法。 例如,当进程在使用 Ctrl+C 时没有终止,最好对该进程 ID 使用 kill -9
maud: ~> ps -ef | grep stuck_process maud 5607 2214 0 20:05 pts/5 00:00:02 stuck_process maud: ~> kill -9 5607 maud: ~> ps -ef | grep stuck_process maud 5614 2214 0 20:15 pts/5 00:00:00 grep stuck_process [1]+ Killed stuck_process |
当一个进程启动多个实例时,killall 可能会更容易。 它采用与 kill 命令相同的选项,但应用于给定进程的所有实例。 在生产环境中使用此命令之前,请先对其进行测试,因为它在某些商业 Unix 系统上可能无法按预期工作。