通常在 Linux 上,如果你点击⎈ Control+C它会发送SIGINT
到程序,并且根据程序如何处理它,它们通常会终止。
然而,对我来说,没有程序终止。它对任何事情都不起作用。它通常终止程序的所有地方都不起作用。例如,如果我正在tail -f
日志文件上运行。
好像SIGINT
没有发送。我不知道如何调整它,甚至不知道如何检查它。
要终止程序,我必须⎈ Control+Z然后手动终止线程。
我已经尝试了很多方法来使其正常工作:
- 不同的终端程序
- 不同的用户
- 重新启动服务器
- 不同的外壳 (
/bin/bash
/bin/sh
)
有用的规格:
- CENTOS 7(从 osx 机器访问)
- bash shell
- 使用 iterm 和终端
- gcloud 虚拟机
我很乐意发送任何人请求的日志或任何调试信息。但我非常困惑。
调试信息:
stty -a
speed 38400 baud; rows 62; columns 270; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
答案1
天哪,六周后我终于发现了问题。
我使用它进行了调试trap
。
运行trap
会给你一个被捕获的信号列表
trap -- '' SIGINT
trap -- '' SIGQUIT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
我在该列表中找到了 SIGINT,因此某些原因导致 SIGINT 被添加到本质上被忽略的陷阱列表中。经过一番挖掘后,我发现一些在我的 bash 配置文件中使用 rvm 加载的 ruby 库正在搞乱捕获。
无论如何,为了修复它,我添加了:
trap - INT
到我的 bash 配置文件的末尾,在 ruby 库的内容之后,一切都很好。
耶!