有没有办法找出程序在收到终止信号 HUP 时会做什么?
无需简单地运行命令 ofc :D
例如,
killall -HUP pppd将重新启动 pppd
killall -HUP firefox只会杀死 firefox
在最近的“为什么 'kill -9 0' 结束我的控制台会话”和“如何获得内核恐慌”问题之间,我在我的马鞍下有一个毛刺,并尝试kill -9 1了一个最新的 Arch linux 笔记本电脑。我是作为用户 ID“root”来做的。
我完全预料到会发生某种崩溃、恐慌或关机,但什么也没发生。我又做了kill -9 1一次,没有效果。
Arch linux 机器systemd这些天都systemd在运行,所以:如何在 kill -9中幸存下来?我希望在 Linux 3.7 内核中有特殊情况代码,但也许存在一些我没有想到的其他原因。
用 PID 1 运行的其他东西呢?init我相信Slackware 仍在使用,但我害怕在我的生产 Slackware 服务器上尝试它。我的无线路由器上的 DD-WRT 运行某种形式的 /sbin/init。
我有时会对进程可以接收的所有信号感到困惑。据我了解,一个进程对这些信号中的每一个都有一个默认处理程序(信号处置),但它可以通过调用sigaction().
所以这是我的问题:是什么导致每个信号被发送?我意识到您可以通过-s参数 to手动向正在运行的进程发送信号kill,但是发送这些信号的自然情况是什么?例如,什么时候SIGINT发送?
另外,对可以处理哪些信号有任何限制吗?甚至SIGSEGV可以处理信号并将控制权返回给应用程序吗?
我的服务器程序收到一个 SIGTERM 并停止(退出代码为 0)。我对此感到惊讶,因为我很确定它有足够的内存。linux (busybox) 在什么情况下会向进程发送 SIGTERM?
适用的 Bash 手册页的完整部分仅说明:
如果运行 bash 的操作系统支持作业控制,则 bash 包含使用它的工具。在进程运行时输入挂起字符(通常是 ^Z、Control-Z)会导致该进程停止并将控制权返回给 bash。 输入延迟挂起字符(通常是 ^Y、Control-Y)会导致进程在尝试从终端读取输入时停止,并将控制权返回给 bash。 然后用户可以操纵这个作业的状态,使用
bg命令在后台继续它,fg命令在前台继续它,或 kill 命令将它杀死。A ^Z 立即生效,并具有导致挂起输出和预先输入被丢弃的额外副作用。
我从来没有用过Ctrl- Y; 我只是刚刚了解它。我只用Ctrl- Z(暂停)做得很好。
我试图想象这个选项的用途。什么时候有用?
(请注意,此功能并非在所有 Unix 变体上都存在。它存在于Solaris和 OpenBSD 上,但不存在于 Linux 或 FreeBSD 上。相应的设置是stty dsusp。)
也许不那么主观:有什么可以用Ctrl-Y不能用Ctrl-轻松完成的事情Z吗?
Ctrl+Z停止作业,而Ctrl+C杀死的工作。
这是为什么?另一种方式不是更有意义吗?
z@z-lap:~$ sleep 100&
[1] 4458
z@z-lap:~$ sleep 200&
[2] 4459
z@z-lap:~$ jobs
[1]- Running sleep 100 &
[2]+ Running sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^Z
[1]+ Stopped sleep 100
z@z-lap:~$ jobs
[1]+ Stopped sleep 100
[2]- Running sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^C
z@z-lap:~$ jobs
[2]+ Running sleep 200 &
Run Code Online (Sandbox Code Playgroud) 我可以 ping google.com几秒钟,当我按Ctrl+时C,底部会显示一个简短的摘要:
$ ping google.com
PING google.com (74.125.131.113) 56(84) bytes of data.
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=2 ttl=56 time=46.7 ms
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=3 ttl=56 time=45.0 ms
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=4 ttl=56 time=54.5 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 3009ms
rtt min/avg/max/mdev = 44.965/48.719/54.524/4.163 ms
Run Code Online (Sandbox Code Playgroud)
但是,当我使用 执行相同的重定向输出到日志文件时tee,不会显示摘要:
$ ping google.com | tee log
PING google.com (74.125.131.113) 56(84) …Run Code Online (Sandbox Code Playgroud) 当我启动一个执行长时间运行的命令的 SSH 会话时,Ctrl+ C(SIGINT) 处理会发生什么?
我可以看到 SSH 会话已关闭,但我不确定谁先获得 SIGINT:是...
远程长时间运行的命令?也就是说,(a) 远程命令中的信号处理程序被调用并停止远程命令,(b) 产生它的外壳检测到命令停止,并停止 (c) 远程 sshd 检测到外壳停止,所以它关闭了连接
或者
本地 ssh 接收到信号,并关闭连接。
我认为 (1) 正在发生,但想确定一下。
我也不确定在这种情况下 shell 处理 SIGINT 会发生什么。例如,如果我...
ssh remote 'while true ; do sleep 1 ; date ; done'
Run Code Online (Sandbox Code Playgroud)
和Ctrl+ C,然后远程连接被删除。有没有办法在Ctrl+后保持活动状态的外壳下运行远程命令C?也就是说,在这种情况下,停止循环并允许我继续在远程 shell 上工作?
如果 Unix (Posix) 进程接收到信号,信号处理程序将运行。
在多线程进程中它会发生什么?哪个线程接收信号?
在我看来,信号 API 应该被扩展来处理(即信号处理程序的线程应该能够被确定),但是在网上寻找信息我只在 linux 内核邮件列表和上发现了长达一年的火焰不同的论坛。据我了解,Linus 的概念不同于 Posix 标准,首先构建了一些兼容层,但现在 Linux 遵循 posix 模型。
目前的状态是什么?
传输间歇性地挂在我的 NAS 上。如果我发送 SIGTERM,它不会从进程列表中消失,并且<defunct>旁边会出现一个标签。如果我发送 SIGKILL,它仍然不会消失并且我无法终止父级,因为父级是init. 我可以摆脱该过程并重新启动传输的唯一方法是重新启动。
我意识到我能做的最好的事情就是尝试修复传输(我已经尝试过),但我是编译的新手,我想确保在我开始搞乱它之前我的种子已经完成。