Questions tagged «signals»

信号是可以发送给正在运行的进程的消息。信号可以由程序,用户或管理员启动。

3
信号在内部如何工作?
一般而言,要终止进程,我们会生成SIGKILL,SIGTSTP等信号。 但是,如何知道是谁订购了该特定信号,是谁将其发送到特定进程的,以及通常来说信号如何执行其操作呢?信号在内部如何工作?

4
Bash中延迟挂起(Ctrl-Y)的目的是什么?
Bash手册页的整个部分仅适用于: 如果运行bash的操作系统支持作业控制,则bash包含使用它的工具。在进程运行时键入暂停字符(通常为^ Z,Control-Z)将导致该进程停止并将控制权返回给bash。 键入延迟的挂起字符(通常为^ Y,Control-Y)会导致该进程在尝试从终端读取输入时停止,并将控件返回到bash。 然后,用户可以使用bg 命令在后台继续执行该作业的状态,fg命令在前台继续执行,或使用kill命令将其删除。^ Z立即生效,并具有额外的副作用,导致丢弃待处理的输出和提前输入。 我从未用过Ctrl- Y; 我只是了解而已。我只用Ctrl- Z(暂停)就可以了。 我试图想象此选项的用途。什么时候有用? (请注意,并非所有Unix变体都具有此功能。Solaris和FreeBSD上存在此功能,而Linux上不存在。相应的设置为stty dsusp。) 也许少主观:有没有什么可以完成Ctrl- Y不能用很容易实现的Ctrl- Z?


2
捕获信号时中断系统调用
通过阅读read()和write()调用上的手册页,可以看出这些调用被信号打断了,而不管它们是否必须阻塞。 特别地,假设 进程为某些信号建立处理程序。 O_NONBLOCK 未设置(即以阻止模式运行)打开设备(例如,终端) 然后,该过程将进行read()系统调用以从设备读取数据,从而执行内核空间中的内核控制路径。 当程序read()在内核空间中执行时,先前安装了处理程序的信号将传递到该进程,并调用其信号处理程序。 阅读SUSv3“系统接口卷(XSH)”中的手册页和相应部分,您会发现: 一世。如果a read()在读取任何数据之前被信号打断(即由于没有可用数据而不得不阻塞),则它将返回-1并将其errno设置为[EINTR]。 ii。如果a read()在成功读取某些数据后被信号中断(即可以立即开始处理请求),则它将返回读取的字节数。 问题A): 我是否正确地假设在任何一种情况下(块/无块)信号的传递和处理对信号都不完全透明read()? 案例一 这似乎是可以理解的,因为阻塞read()通常会将进程置于TASK_INTERRUPTIBLE状态,以便在传递信号时,内核会将进程置于TASK_RUNNING状态。 但是,当read()不需要阻塞(情况ii。)并在内核空间中处理请求时,我会认为信号的到达及其处理将是透明的,就像硬件的到达和正确处理一样中断会。特别是,我会假设在传递信号后,该过程将被暂时置于用户模式下以执行其信号处理程序,然后该信号处理程序将最终返回该用户处理程序,以完成对中断read()(在内核空间中)的处理,从而read()运行其直到完成为止,然后过程返回到调用read()(在用户空间中)之后的点,结果将读取所有可用字节。 但是ii。似乎暗示read()中断了,因为数据立即可用,但是它返回时仅返回部分数据(而不是全部)。 这使我想到了第二个(也是最后一个)问题: 问题B): 如果我在A)下的假设是正确的,那么read()即使不需要阻塞,因为有可用的数据可以立即满足请求,为什么会被中断?换句话说,为什么read()在执行信号处理程序后不能恢复,最终导致所有可用数据(毕竟是可用的)被返回?

1
systemd如何在杀死-9时幸存?
在最近的“为什么'kill -9 0'为什么终止我的控制台会话”和“如何使内核崩溃”这两个问题之间,我陷入了困境,并尝试kill -9 1使用一台最新的Arch Linux笔记本电脑。我以用户ID“ root”的身份进行了操作。 我完全预期会发生某种崩溃,恐慌或关机,但没有任何反应。我又做了kill -9 1一次,没有任何效果。 如今,Arch linux机器正在运行systemd,因此:systemdkill -9 如何生存?我希望Linux 3.7内核中有特殊情况的代码,但是也许还有其他我没有想到的原因。 用PID 1运行的其他内容又如何呢?init我相信Slackware仍会使用,但是我不敢在我的生产Slackware服务器上尝试它。我的无线路由器上的DD-WRT运行/ sbin / init某种形式。

2
是什么导致发送各种信号?
有时,我会对进程可以接收的所有信号感到有些困惑。据我了解,进程为每个信号都有一个默认的处理程序(信号处理),但是它可以通过调用提供自己的处理程序sigaction()。 所以这是我的问题:是什么原因导致每个信号被发送?我意识到您可以通过-s参数to 手动将信号发送到正在运行的进程kill,但是在什么自然条件下发送这些信号?例如,何时SIGINT发送? 另外,可以处理哪些信号是否有任何限制?甚至SIGSEGV可以处理信号并将控制权返回给应用程序吗?
28 process  signals 

2
如何杀死其父级为init的<defunct>进程?
传输间歇性地挂在我的NAS上。如果我发送SIGTERM,它不会从进程列表中消失,并且&lt;defunct&gt;它旁边会出现一个标签。如果我发送SIGKILL,它仍然不会消失并且我不能终止父级,因为父级是init。我摆脱进程并重新启动传输的唯一方法是重新启动。 我意识到我能做的最好的事情就是尝试修复Transmission(而且我已经尝试过),但是我是编译的新手,我想确保自己的洪流在开始处理之前就完成了。

1
Ctrl C与Ctrl Z与前景工作
Ctrl+ Z停止工作,而Ctrl+ C取消工作。 这是为什么?另一种方式会更有意义吗? z@z-lap:~$ sleep 100&amp; [1] 4458 z@z-lap:~$ sleep 200&amp; [2] 4459 z@z-lap:~$ jobs [1]- Running sleep 100 &amp; [2]+ Running sleep 200 &amp; z@z-lap:~$ fg %1 sleep 100 ^Z [1]+ Stopped sleep 100 z@z-lap:~$ jobs [1]+ Stopped sleep 100 [2]- Running sleep 200 &amp; z@z-lap:~$ fg %1 …

2
当您尝试永久终止流程时,应使用哪个“ kill”选项?
我从人们那里收到很多混杂的消息,并且想知道它与您使用的内容是否真的没有太大区别。 kill 'x' killall 'x' kill -9 'x' 这些是到目前为止我被告知要使用的一些选项,但是有人说kill -9只是过大的杀伤力,单靠杀死是行不通的,等等。 在最标准的情况下(仅终止一个过程)(因此也包括它的状态),是否有人建议使用哪个? [编辑]我在寻找要停止执行过程时要使用的内容,以便可以从头开始运行一个新的过程
26 process  kill  signals 

2
为什么我不能用SIGTERM终止SIGSTOP的进程,并且将待处理信号存储在哪里?
我正在使用Debian Stretch(systemd)。我在前台使用rsyslog守护程序运行 /usr/sbin/rsyslogd -n ,我做了一个Ctrl+ Z来停止它。进程的状态更改为Tl(已停止,已线程化)。我向流程发出了多个命令,流程的状态是相同的:。一旦我做了一个,它就死了。我有3个问题。kill -15 &lt;pid&gt;Tlfg 为什么SIGSTOP-ed过程没有响应SIGTERM?为什么内核将其保持在相同状态? 为什么收到SIGCONT信号后就被杀死了? 如果是由于先前的SIGTERM信号,在恢复过程之前将其保存在哪里?
24 process  kill  signals 


5
如何使`xargs`忽略孩子的出口并继续处理
我有时xargs整夜都从事长时间的工作,而早上发现xargs死在中间某个地方真的很烦,例如,由于一个特殊情况下的分割错误,就像今天晚上发生的那样。 如果甚至有一个xargs孩子被杀,它也将不再处理任何输入: 控制台1: [09:35:48] % seq 40 | xargs -i --max-procs=4 bash -c 'sleep 10; date +"%H:%M:%S {}";' xargs: bash: terminated by signal 15 09:35:58 3 09:35:58 4 09:35:58 2 &lt;Exit with code 125&gt; 控制台2: [09:35:54] kill 5601 我可以以某种方式阻止xargs子进程死后停止处理更多输入,而是继续处理吗?
24 kill  xargs  signals 



5
Ctrl + C时如何在shell脚本中杀死并等待后台进程完成?
我正在尝试设置一个shell脚本,使其运行后台进程,当我执行Ctrlc该shell脚本时,它将杀死子级,然后退出。 我设法提出的最好的办法就是这个。看来,在kill 0 -INT等待发生之前也会杀死脚本,因此shell脚本在子进程完成之前就死掉了。 关于如何使此Shell脚本等待孩子在发送后死亡的任何想法INT? #!/bin/bash trap 'killall' INT killall() { echo "**** Shutting down... ****" kill 0 -INT wait # Why doesn't this wait?? echo DONE } process1 &amp; process2 &amp; process3 &amp; cat # wait forever

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.