signal - Linux/Unix命令

向程序发送信号,并控制它们的运行方式

Linux.支持POSIX可靠信号(下文中,“标准信号”)和POSIX实时信号。

在Linux上使用信号

Linux系统上的信号告诉操作系统如何处理一个正在运行的程序或进程。当你正常关闭一个程序时,它实际上会向系统发送一个信号,告诉它关闭程序。你也可以手动操作。

首先寻找您想要关闭的进程。你可以这样做:

Ps aux | grep -i

所以,如果你想从命令行关闭Firefox,输入:

Ps aux | grep -i firefox

你会得到一个巨大的进程列表火狐因为它是一个多线程应用程序。查找/usr/lib/firefox的基本进程。通常是第一个。

Linux进程列表Firefox

如果您发现压倒性,也可以使用PGREP.。它类似地运行,但仅为您提供流程ID。

pgrep火狐

最低的进程ID将是您需要的基本进程。

Linux PGREP Firefox.

当您拥有它时,查找进程ID号。首先列出的总是运行流程的用户。接下来是进程ID。有了这个,你可以发送SIGTERM向进程发出信号以停止它使用杀戮命令

杀死sigterm 4790
Linux SIGTERM火狐

每个信号还具有速记的相应数字。sigterm的数字是15,所以你可以像使用完整的单词一样使用它。

杀死-15 4790.

sigterm实际上是kill命令的默认操作。因此,您实际上不需要指定它。只需使用:

4790年杀

你会得到完全一样的结果。

如果进程是响应性的,那么这当然很好,但您可能不会以这种方式关闭响应性的进程,至少在桌面中不会。那么,你如何处理一个反应迟钝的过程呢?有很多可能的信号。为了更好地了解这个范围有多宽,查阅它们。

杀死-l.
Linux信号列表

是的,有很多。值得庆幸的是,除非您开始开发或编写系统管理脚本,否则您不会触及绝大多数。当Sigterm无法阻止无响应的过程时,您将会浏览Linux等价物Ctrl + Alt + DeleteSigkill.

与臭名昭著的Ctrl+Alt+Delete进程管理器不同,SIGKILL实际上是可以工作的。事实上,不管怎样,这意味着忽略所有其他因素,并删除冒犯的过程。这也意味着,如果您弄错了进程,SIGKILL可能会很危险。

以完全相同的方式开始,通过查找进程ID。

pgrep火狐

现在,不再使用SIGTERM来停止进程,而是使用更具破坏性的SIGKILL。

杀死sigkill 4790

即使进程被完全锁定,也应该在几秒钟内关闭。

Linux SIGKILL火狐

就像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,默认行为SIGSYSSIGXCPU.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实现使用前三个实时信号。)

未处理实时信号的默认操作是终止接收进程。

实时信号通过以下内容区分:

  1. 可以排队多个实时信号实例。相比之下,如果在当前阻止该信号时传送了标准信号的多个实例,则只有一个实例被排队。
  2. 如果信号是用sigqueue.(2),一个伴随值(一个整数或一个指针)可以随信号发送。属性,如果接收进程为该信号建立一个处理程序SA_SIGACTION旗帜个sigaction(2)然后它可以通过该数据获得此数据si_value田野siginfo_t.结构作为第二个参数传递给处理程序。此外,si_pidsi_uid.字段可以用来获取发送信号的进程的PID和真实用户ID。
  3. 实时信号以保证的顺序传递。多个相同类型的实时信号按照发送的顺序发送。如果不同的实时信号被发送到一个进程,它们将从最低编号的信号开始发送。(即,低编号的信号具有最高的优先级。)

如果一个进程的标准信号和实时信号都是挂起的,POSIX将不指定哪个信号先传递。与许多其他实现一样,Linux在这种情况下优先考虑标准信号。

根据POSIX,实现应至少允许至少_posix_sigqueue_max(32)实时信号排队到进程。然而,Linux而不是置于每个流程限制,而是对所有进程的排队实时信号的数量施加系统范围限制。可以通过该限制(和特权)通过/proc/sys/kernel/rtsig-max文件。一个相关的文件,/proc/sys/kernel/rtsig-max,可用于找出当前有多少实时信号正在排队。

符合

posix.1.

使用男人命令(% 男人),以查看命令如何在您的特定计算机上使用。

这个页面有用吗?