Ctrl + c 不会杀死进程

Ctrl + c 不会杀死进程

我一直在寻找答案,但到目前为止没有找到任何东西可以回答我的问题。我当前正在登录我的 Ubuntu 服务器,在运行进程时我无法在其上运行任何中断。这是我的 stty -a:

user@Ubuntu1:~$ stty -a
speed 38400 baud; rows 93; columns 200; 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;

我的 .bashrc 中没有任何内容可以更改中断。

这对于包括 root 在内的所有用户都是相同的。我还尝试使用不同的终端从不同的位置登录,每次都会出现相同的结果。我已经使用了 ssh 和 ssh -X 来登录。

编辑:在本地,我的所有中断都工作正常。

更新:我仍在寻找答案。我的朋友也有同样的问题。问题似乎很严重,当登录(从 PC、Mac、Linux)时,键盘没有拾取这些键(即使映射正确)。

答案1

ctrl+c永远不会终止程序,

它不是这么做的。

POSIX 标准定义了一组信号,这些信号用于控制正在运行的程序。

  First the signals described in the original POSIX.1-1990 standard.
  Signal     Value     Action   Comment
  ──────────────────────────────────────────────────────────────────────
  SIGHUP        1       Term    Hangup detected on controlling terminal
                                or death of controlling process
  SIGINT        2       Term    Interrupt from keyboard
  SIGQUIT       3       Core    Quit from keyboard
  SIGILL        4       Core    Illegal Instruction
  SIGABRT       6       Core    Abort signal from abort(3)
  SIGFPE        8       Core    Floating point exception
  SIGKILL       9       Term    Kill signal
  SIGSEGV      11       Core    Invalid memory reference
  SIGPIPE      13       Term    Broken pipe: write to pipe with no
  SIGTERM      15       Term    Termination signal

-http://man7.org/linux/man-pages/man7/signal.7.html

ctrl+向您从终端运行的程序c发送信号“键盘中断”。2

处理该信号完全取决于程序,它可以做任何它想做的事。许多脚本语言解释器可能会以默认方式处理此问题,即终止被调用的脚本并正常退出。

如果您希望程序退出,特别是从自动上下文中退出,建议使用singal 15,该kill程序可用于通过id(pid)向进程发送信号。

kill -15 <pid>

据我所知,程序本身仍然会接收到这个信号,并且应该尽可能干净地终止。

如果程序忽略信号 15,并且程序仍然存在(并且您不会由于权限错误而无法发送信号)

kill -9 <pid>

据我所知,信号 9 由内核(任务管理器和硬件接口)解释,内核突然停止处理程序,并取消分配/释放其所有资源。

答案2

这是一些硬核技巧:

Control-Z

它将暂停您的进程并返回该进程的作业 ID

然后:

kill -9 %1

(将 1 替换为您的工作 ID)。

注意:百分比是强制性的!否则你将杀死你的 init 进程,这意味着你将杀死内核并且整个系统将崩溃(所以不要在中间放置空格:)

答案3

如果我不得不猜测,那是因为您可能在终端设置中将Ctrl+映射到“复制”。C如果将其更改为Ctrl+ Shift+ C,则Ctrl+C将再次正常工作以停止进程。

答案4

我遇到了这个旧论坛帖子关于这个特定问题。看来默认的中断序列可以在某个单独的配置文件中被覆盖。

如果您只是想从外部终止此进程,您可以使用kill,但要注意,您应该按照本节中的概述升级kill关于杀死进程的文章,而不是仅仅跳到最极端的杀-9。

维基百科是一个伟大的杀死程序的资源。这里还有一个Unix 信号列表以及他们做什么。

相关内容