我们最近配置的几个云服务器似乎默认忽略信号。我可以弄清楚是什么配置导致了这种行为,它影响了依赖捕获信号的ctrl
+和 bash 脚本。c
这可以使用 sleep 命令来演示,对比此环境中正常运行的服务器(几年前设置的)与受影响的服务器之一。
[email protected] ~ $ sleep 300 &
[1] 9554
[email protected] ~ $ cat /proc/9554/status
Name: sleep
Umask: 0002
State: S (sleeping)
Tgid: 9554
<snip /> ...
SigQ: 0/63430
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
<snip /> ...
[email protected] ~ $ kill -s SIGINT 9554
[email protected] ~ $
[email protected] ~ $
[1]+ Interrupt sleep 300
[email protected] ~ $ ps aux | grep [s]leep
在我们的云虚拟机之一上运行相同的命令会产生:
[email protected] ~ $ sleep 300 &
[1] 2199
[email protected] ~ $ cat /proc/2199/status
Name: sleep
Umask: 0002
State: S (sleeping)
Tgid: 2199
Ngid: 0
Pid: 2199
<snip /> ...
SigQ: 0/482668
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000006 <-- note the Signal Ignore flag are set
SigCgt: 0000000000000000
<snip /> ...
[email protected] ~ $ kill -s SIGINT 2199
[email protected] ~ $ ps aux | grep [s]leep
me 2199 0.0 0.0 107952 360 pts/1 S 16:35 0:00 sleep 300
[email protected] ~ $ sudo kill -s SIGINT 2199
[email protected] ~ $ ps aux | grep [s]leep
me 2199 0.0 0.0 107952 360 pts/1 S 16:35 0:00 sleep 300
[email protected] ~ $ sudo kill -s SIGKILL 2199
[1]+ Killed sleep 300
起初我以为这是一些影响我的 pty 的 SSH 问题,但事实似乎并非如此,并且遇到了这个U&L问题我发现查看正在运行的进程的状态,发现该服务器似乎启动了所有正在运行的进程,并且忽略了一组基本信号。
我找不到任何地方详细说明如何设置为您启动的任何进程阻止的信号。有没有人遇到过这样的事情?
答案1
对于遇到类似问题的任何人来说,在这种特殊情况下,问题是由作为映像的一部分安装在这些云服务器上的 Ruby 虚拟机 v1.27.4 中的错误引起的。
RVM 错误是覆盖正常函数(如 cd)的脚本,其中捕获 SIGINT 但在清理时不释放它。更多详情可在这找到Ruby RVM 错误
本例中的修复方法是将 RVM 更新到最新的稳定版(本例中为 1.29.7)。
curl -sSL https://get.rvm.io | bash -s stable --ruby
感谢 mosvy 的指点。