Questions tagged «signals»

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

3
使用SIGWINCH退出Apache服务退出
运行时,service apache start我在日志文件中看到以下条目: [mpm_event:notice] [pid 1906:tid XXX] AH00489: Apache/2.4.23 (Unix) OpenSSL/1.0.2g PHP/7.0.9 configured -- resuming normal operations [core:notice] [pid 1906:tid XXX] AH00094: Command line: '/usr/sbin/httpd' [mpm_event:notice] [pid 1906:tid XXX] AH00492: caught SIGWINCH, shutting down gracefully 服务apache无法启动?我可以在互联网上找到SIGWINCH[ Window size change]的含义,但在这种情况下并不能真正帮助我。 文件/etc/systemd/system/apache.service: [Unit] Description=The Apache Webserver [FaF Compiled] After=network.target nss-lookup.target time-sync.target Before=getty@tty1.service …

2
为什么僵尸在等孩子呢?
我正在研究不同的来源,但找不到关于儿童收割的解剖结构的良好描述。这是我想了解的一个简单案例。 $ cat <( sleep 100 & wait ) & [1] 14247 $ ps ax -O pgid | grep $$ 12126 12126 S pts/17 00:00:00 bash 14248 12126 S pts/17 00:00:00 bash 14249 12126 S pts/17 00:00:00 sleep 100 14251 14250 S pts/17 00:00:00 grep --color=auto 12126 $ kill -2 …

2
在ssh -t上的stderr
这会将输出发送到STDERR,但不会传播Ctrl+ C(即Ctrl+ C将杀死ssh但不会杀死remote sleep): $ ssh localhost 'sleep 100;echo foo ">&2"' 这会传播Ctrl+ C(即Ctrl+ C将杀死ssh并远程sleep发送),但会将STDERR发送到STDOUT: $ ssh -tt localhost 'sleep 100;echo foo ">&2"' 在仍然传播Ctrl+的同时,如何强制第二个将STDERR输出发送到STDERR C? 背景 GNU Parallel使用'ssh -tt'来传播Ctrl+ C。这样可以杀死远程运行的作业。但是发送到STDERR的数据应在接收端继续发送到STDERR。

4
为什么不能通过击键杀死Bash脚本调用的超时?
[编辑:这看起来与其他一些问题类似,询问如何杀死所有产生的进程-答案似乎都是使用pkill。因此,我的问题的核心可能是:是否可以将Ctrl-C / Z传播到脚本生成的所有进程?] 当rec使用timeout来自coreutils 的命令调用SoX 时(这里已讨论),一旦从Bash脚本中调用它,似乎没有任何办法可以通过击键杀死它。 例子: timeout 10 rec test.wav ...可以用bash中的Ctrl+ C或Ctrl+ 杀死Z,但不能从脚本内部调用。 timeout 10 ping nowhere ...可以被杀死Ctrl+ C或Ctrl+ Z从庆典,并与Ctrl+ Z当它在脚本中运行。 我可以找到进程ID并以这种方式将其杀死,但是为什么不能使用标准的击键动作呢?并且有什么方法可以构造我的脚本,以便可以吗?

2
为什么只有两个用户定义的信号?
在linux系统中定义的信号列表中,有两个信号称为“用户定义的信号”(SIGUSR1和SIGUSR2)。在特定情况下会引发或捕获其他信号,但是SIGUSR留给用户应用程序使用。 那么为什么只有两个信号呢?
11 history  signals  ipc 

2
Bash脚本没有看到SIGHUP?
我有以下脚本: #!/bin/bash echo "We are $$" trap "echo HUP" SIGHUP cat # wait indefinitely 当我发送SIGHUP(使用kill -HUP pid)时,没有任何反应。 如果我稍微更改脚本: #!/bin/bash echo "We are $$" trap "kill -- -$BASHPID" EXIT # add this trap "echo HUP" SIGHUP cat # wait indefinitely ...然后脚本在echo HUP退出时会正确执行操作(当我按Ctrl + C时): roger@roger-pc:~ $ ./hupper.sh We are 6233 ^CHUP …
11 bash  signals 

1
将SIGINT或SIGTERM发送给父脚本本身而不是子进程时执行命令或函数
假设我有这个 script.sh #!/bin/bash exit_script() { echo "Printing something special!" echo "Maybe executing other commands!" kill -- -$$ # Sends SIGTERM to child/sub processes } echo "Some other text" #other commands here sleep infinity 我想script.sh执行的功能exit_script时,它接收SIGINT或SIGTERM 例如: killall script.sh # it will send SIGTERM to my script 我希望我的脚本执行此操作 exit_script() { echo "Printing …

2
为什么while循环在被暂停后会停止?
为什么使用bash并暂停while循环,然后在恢复循环后停止循环?下面的简短示例。 $ while true; do echo .; sleep 1; done . . ^Z [1]+ Stopped sleep 1 $ fg sleep 1 $ 我熟悉信号,我猜这可能是bash的自然行为,但我想更好地理解为什么它会以这种特定方式运行。

1
注销时,SIGHUP在什么情况下不发送到作业?
我从一个声称正在跑步的用户那里得到了一个答案 foo 2>&1 >& output.log & foo即使他们注销也将导致继续运行。根据该用户的说法,这甚至可以通过SSH连接工作。 我真的不相信,因为我的印象是,在断开与SSH的连接或终止TTY的情况下,shell及其进程将收到SIGHUP,从而导致它们终止。这一点,我的假设下,被使用的唯一理由nohup在这样的情况下,或者tmux,screen等。 然后,我查看了glibc的手册: 该信号还用于向与该会话相关联的作业报告终端上控制过程的终止;该终止有效地断开了会话中的所有进程与控制终端的连接。 这似乎证实了我的想法。但进一步看,它说: 如果进程是具有控制终端的会话领导者,则将SIGHUP信号发送到前台作业中的每个进程,并且将控制终端与该会话解除关联。 那么,这是否意味着放在后台的作业将不会收到SIGHUP? 令我进一步困惑的是,当Zsh警告我我正在运行作业时,我进行了一个交互式Zsh会话,yes >& /dev/null &并键入exit,然后再次键入后exit,告诉我说它已经完成了一项工作。在Bash中执行完全相同的操作会使工作继续进行……
10 ssh  tty  signals 

1
交互式外壳在孤立的流程组中应该做什么?
(根据/programming/13718394/what-should-interactive-shells-do-in-orphaned-process-groups中的建议在UNIX中重新发布) 简短的问题是,如果外壳程序位于不拥有tty的孤立进程组中,它应该怎么办?但我建议阅读冗长的问题,因为这很有趣。 这是一种有趣且令人兴奋的方法,可以使用您喜欢的外壳将笔记本电脑变成便携式太空加热器(除非您是那些tcsh怪人之一): #include <unistd.h> int main(void) { if (fork() == 0) { execl("/bin/bash", "/bin/bash", NULL); } return 0; } 这导致bash将CPU固定在100%。zsh和fish的作用相同,而ksh和tcsh则对工作控制含糊其辞,然后再进行龙骨化处理,这虽然好一些,但效果不明显。哦,这是与平台无关的违规者:OS X和Linux都受影响。 我的解释(可能是错误的)如下:子外壳检测到它不在前台:tcgetpgrp(0) != getpgrp()。因此,它试图停止自身:killpg(getpgrp(), SIGTTIN)。但是它的进程组是孤立的,因为它的父级(C程序)是领导者并死亡,并且SIGTTIN发送给孤立进程组的操作只是被丢弃(否则什么也无法再次启动它)。因此,子外壳并没有停止,但是它仍然在后台,因此马上就可以再次执行所有操作。冲洗并重复。 我的问题是,命令行外壳程序如何检测到这种情况?正确的做法是什么?我有两个解决方案,都不是理想的: 尝试通知其pid与我们的组ID匹配的进程。如果使用失败ESRCH,则表明我们很可能成为孤儿。 尝试从中无阻塞读取一个字节/dev/tty。如果使用失败EIO,则表明我们很可能成为孤儿。 (我们跟踪此问题的是https://github.com/fish-shell/fish-shell/issues/422) 感谢您的想法!


2
为什么bash会忽略SIGTERM?
有时,当我想快速注销时,我会这样做kill -15 -1。我注意到bash忽略了SIGTERM。 我想知道这种bash行为的原理是什么? 在没有充分理由的情况下忽略SIGTERM并不是很UNIX,不是吗? 更新: 对所有人都相同(无)的影响: $ kill -TERM $$ $ type kill kill is a shell builtin $ command kill -TERM $$ $ /bin/kill -TERM $$ UPDATE2: 来自man bash: 当bash是交互式的时,在没有任何陷阱的情况下,它将忽略SIGTERM 因此,它是有目的的。但为什么?
10 bash  signals 


2
在Ctrl + C上,终止当前命令,但继续执行脚本
我有一个bash脚本,其中我执行一行,休眠一段时间,然后在tail -f日志文件中验证是否可以看到某种模式,按ctrl + c退出,tail -f然后移至下一行直到bash脚本完成执行: 到目前为止,这是我所做的: #!/bin/bash # capture the hostname host_name=`hostname -f` # method that runs tail -f on log_file.log and looks for pattern and passes control to next line on 'ctrl+c' echo "===================================================" echo "On $host_name: running some command" some command here echo "On $host_name: sleeping for 5s" …
10 bash  shell  signals  trap 

3
防止SIGINT传播到父进程
考虑到以下情况:父子程序(可以是C ++程序或Shell脚本)执行子Shell脚本,当我们在执行子Shell脚本时按Control + C(或配置为INTR的任何字符)时, SIGINT发送到前台进程组中的所有进程。这包括父进程。 资料来源:POSIX.1-2008 XBD第11.1.9节 有没有办法覆盖此默认行为?CHILD进程独自处理信号而没有传播给父进程吗? 参考:堆栈溢出后-子进程中断时父进程未完成(TRAP INT)

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.