Linux.支持POSIX可靠信号(下文中,“标准信号”)和POSIX实时信号。
在Linux上使用信号
Linux系统上的信号告诉操作系统如何处理一个正在运行的程序或进程。当你正常关闭一个程序时,它实际上会向系统发送一个信号,告诉它关闭程序。你也可以手动操作。
首先寻找您想要关闭的进程。你可以这样做:
Ps aux | grep -i
所以,如果你想从命令行关闭Firefox,输入:
Ps aux | grep -i firefox
你会得到一个巨大的进程列表火狐因为它是一个多线程应用程序。查找/usr/lib/firefox的基本进程。通常是第一个。
如果您发现压倒性,也可以使用PGREP.。它类似地运行,但仅为您提供流程ID。
pgrep火狐
最低的进程ID将是您需要的基本进程。
当您拥有它时,查找进程ID号。首先列出的总是运行流程的用户。接下来是进程ID。有了这个,你可以发送SIGTERM向进程发出信号以停止它使用杀戮命令。
杀死sigterm 4790
每个信号还具有速记的相应数字。sigterm的数字是15,所以你可以像使用完整的单词一样使用它。
杀死-15 4790.
sigterm实际上是kill命令的默认操作。因此,您实际上不需要指定它。只需使用:
4790年杀
你会得到完全一样的结果。
如果进程是响应性的,那么这当然很好,但您可能不会以这种方式关闭响应性的进程,至少在桌面中不会。那么,你如何处理一个反应迟钝的过程呢?有很多可能的信号。为了更好地了解这个范围有多宽,查阅它们。
杀死-l.
是的,有很多。值得庆幸的是,除非您开始开发或编写系统管理脚本,否则您不会触及绝大多数。当Sigterm无法阻止无响应的过程时,您将会浏览Linux等价物Ctrl + Alt + Delete那Sigkill.。
与臭名昭著的Ctrl+Alt+Delete进程管理器不同,SIGKILL实际上是可以工作的。事实上,不管怎样,这意味着忽略所有其他因素,并删除冒犯的过程。这也意味着,如果您弄错了进程,SIGKILL可能会很危险。
以完全相同的方式开始,通过查找进程ID。
pgrep火狐
现在,不再使用SIGTERM来停止进程,而是使用更具破坏性的SIGKILL。
杀死sigkill 4790
即使进程被完全锁定,也应该在几秒钟内关闭。
就像SIGTERM一样,有一个对应于SIGKILL的数字。在这种情况下,它是9.。
杀死-9 4790.
就像之前一样,这个过程几乎应该立即死亡。
你也应该意识到sigint.。这是键盘中断,它比在命令行中思考的更多命令。当你按下Ctrl + C要从终端窗口停止进程,您实际上是发出SIGINT。它的代码是2,您可以像使用kill命令一样使用它。
杀死2 4790
这并不常见,因为你更有可能去Ctrl + C,但最好能意识到这一点。
这些是到目前为止您在日常Linux使用中遇到的最常见的信号。对于其他信号的技术性分析,请继续阅读下一节。
的技术细节
如果您是系统管理员或希望为Linux开发,您可能希望深入了解Linux上的信号系统后面的技术细节。下一节探讨了Linux信号的完整技术细分。您绝对不需要这些信息在您的桌面上使用Linux,但如果您打算探索系统的内部工作,它可以证明宝贵。
标准信号
Linux支持下面列出的标准信号。如“Value”列所示,有几个信号号是与体系结构相关的。(当给出三个值时,第一个值通常对alpha和sparc有效,中间一个值对i386, ppc和sh有效,最后一个值对mips有效。A -表示在相应的体系结构上没有信号。)
表中“Action”列的条目指定了信号的默认动作,如下所示:
学期:默认操作是终止进程。
Ign:默认操作是忽略信号。
核心:默认操作是终止进程并转储核心。
停止:默认操作是停止进程。
首先,原始POSIX.1标准中描述的信号。
信号 | 价值 | 行动 | 评论 |
或控制过程的死亡 | |||
sigint. | 2 | 学期 | 从键盘中断 |
SIGQUIT | 3. | 核心 | 戒烟从键盘 |
史累累 | 4. | 核心 | 非法指令 |
SIGABRT. | 6. | 核心 | 中止信号从中止(3) |
我试 | 8. | 核心 | 浮点异常 |
Sigkill. | 9. | 学期 | 杀了信号 |
SIGSEGV信号 | 11 | 核心 | 内存参考无效 |
SIGPIPE | 13 | 学期 | 破管:用没有读者写入管道 |
sigalrm. | 14 | 学期 | 计时器信号来自报警(2) |
SIGTERM | 15 | 学期 | 终止信号 |
SIGUSR1 | 30日,10日,16岁 | 学期 | 用户定义的信号1 |
SIGUSR2 | 31日,12日,17岁 | 学期 | 用户定义的信号2 |
SIGCHLD | 20,17,18 | Ign | 终止或终止儿童 |
sigcont. | 19,18,25 | 如果停止了继续 | |
SIGSTOP | 17,19,23 | 停止 | 停止过程 |
SIGTSTP | 18、20、24 | 停止 | 停止键入tty |
sigttin. | 21,21,26 | 停止 | Tty输入后台进程 |
SIGTTOU | 22日,22日,27岁 | 停止 | Tty后台进程的输出 |
的信号Sigkill.和SIGSTOP不能被抓住,被阻止或忽略。
接下来是不在POSIX.1标准中但在SUSv2和SUSv3 / POSIX 1003.1-2001中描述的信号。
信号 | 价值 | 行动 | 评论 |
SIGPOLL. | 学期 | 轮询事件(Sys V)。SIGIO的同义词 | |
sigprof. | 27日,27日,29岁 | 学期 | 分析定时器已过期 |
SIGSYS | 12 - 12所示 | 核心 | 常规的坏争执(SVID) |
sigtrap. | 5. | 核心 | 跟踪/断点陷阱 |
SIGURG | 16日,23日,21岁 | Ign | 插座上的紧急情况(4.2 BSD) |
SIGVTALRM | 26,26,28 | 学期 | 虚拟闹钟(4.2 BSD) |
SIGXCPU. | 24,24,30 | 核心 | CPU时间限制超过(4.2 BSD) |
SIGXFSZ. | 25日,25日,31日 | 核心 | 文件大小超过限制(4.2 BSD) |
直到并包括Linux 2.2,默认行为SIGSYS那SIGXCPU.那SIGXFSZ.,和(在sparc和mips以外的架构上)rt_signal_lease是终止进程(不包含核心转储)。(在其他一些unix上,默认操作为SIGXCPU.和SIGXFSZ.是在没有核心转储的情况下终止进程。)Linux 2.4符合POSIX 1003.1-2001对这些信号的要求,以核心转储结束进程。
接下来,各种其他信号。
信号 | 价值 | 行动 | 评论 |
SIGEMT | 7, - ,7 | 学期 | |
SIGSTKFLT | 、16日 | 学期 | 协处理器上的堆栈错误(未使用) |
秒数 | 23,29,22 | 学期 | I/O现在可能(4.2 BSD) |
SIGCLD | - , - ,18岁 | Ign | sigchld的同义词 |
SIGPWR. | 29、30、19 | 学期 | 电源故障(系统V) |
SIGINFO | 29, - , - | SIGPWR的同义词 | |
siglost. | -, -, - | 学期 | 文件锁了 |
SIGWINCH | 28日,28日20 | Ign | 窗口调整信号大小(4.3 BSD,Sun) |
SIGUNUSED | - 31, - | 学期 | 未使用的信号(将是sigsys) |
(信号29是SIGINFO/SIGPWR.但是siglost.在sparc)。
SIGEMT未在POSIX 1003.1-2001中指定,但在大多数其他联合人人中,它默认动作通常会出现在核心转储中的默认操作。
SIGPWR.(在POSIX 1003.1-2001中没有指定)通常默认情况下在出现它的其他unix上被忽略。
秒数(在几个One委员会中默认,忽略在POSIX 1003.1-2001中未指定的)。
实时信号
Linux支持POSIX.4实时扩展中最初定义的实时信号(现在包含在POSIX 1003.1-2001中)。Linux支持32个实时信号,从32 (SIGRTMIN)至63 (sigrtmax.)。(程序应始终指使用符号的实时信号SIGRTMIN+n,因为实时信号数的范围在不同的unix系统中是不同的。)
与标准信号不同,实时信号没有预定义的含义:整个实时信号集可用于应用定义的目的。(但是,注意,LinuxThreads实现使用前三个实时信号。)
未处理实时信号的默认操作是终止接收进程。
实时信号通过以下内容区分:
- 可以排队多个实时信号实例。相比之下,如果在当前阻止该信号时传送了标准信号的多个实例,则只有一个实例被排队。
- 如果信号是用sigqueue.(2),一个伴随值(一个整数或一个指针)可以随信号发送。属性,如果接收进程为该信号建立一个处理程序SA_SIGACTION旗帜个sigaction(2)然后它可以通过该数据获得此数据si_value田野siginfo_t.结构作为第二个参数传递给处理程序。此外,si_pid和si_uid.字段可以用来获取发送信号的进程的PID和真实用户ID。
- 实时信号以保证的顺序传递。多个相同类型的实时信号按照发送的顺序发送。如果不同的实时信号被发送到一个进程,它们将从最低编号的信号开始发送。(即,低编号的信号具有最高的优先级。)
如果一个进程的标准信号和实时信号都是挂起的,POSIX将不指定哪个信号先传递。与许多其他实现一样,Linux在这种情况下优先考虑标准信号。
根据POSIX,实现应至少允许至少_posix_sigqueue_max(32)实时信号排队到进程。然而,Linux而不是置于每个流程限制,而是对所有进程的排队实时信号的数量施加系统范围限制。可以通过该限制(和特权)通过/proc/sys/kernel/rtsig-max文件。一个相关的文件,/proc/sys/kernel/rtsig-max,可用于找出当前有多少实时信号正在排队。
符合
posix.1.
使用男人命令(% 男人),以查看命令如何在您的特定计算机上使用。