Ctrl + C不会杀死进程


8

我一直在寻找答案,但到目前为止没有发现任何答案。我目前正在登录我的Ubuntu服务器,并且在运行进程时无法在其上运行任何中断。这是我的姿势-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登录时,键盘没有拾取这些键(即使映射正确)。


Ctrl+V和hit 的输出是Ctrl+C什么?您是否尝试过终止进程kill -s 2 <pid_of_process>?这应等于将SIGINT信号发送到该进程。检查您的终端仿真器密钥设置。

输出正确。如果我执行以下Ctrl + V,然后按Ctrl + CI,则得到^ C。如果我按Ctrl + V,然后按Ctrl + Z,我将得到^ Z。如果我从另一个终端执行此操作,则可以使用kill杀死进程。还要注意,在本地和其他终端中,这些命令也可以正常工作
user700786 2012年

3
您是否Ctrl+C在运行其他进程(例如cat)时尝试点击?也许是那个过程被忽略了Ctrl+C。还是您的意思是在Ubuntu服务器本地,该特定进程会响应Ctrl+C,在这种情况下,您尝试在哪个终端上运行?那screen会议呢?
吉尔斯(Gilles)'所以

如果我在机器的终端上运行任何程序,那么它将毫无问题地接收中断。一旦我将其插入服务器,它就不会接收中断。我尝试过的所有进程均未收到任何中断
user700786'2

如果该命令获取与杀死kill -s 2(注意-s 2,这就是SIGINT(当你按下Ctrl + C键,默认为,通常列发出的信号killSIGTERM)),则该命令忽略中断。还有其他东西正在捡起它。当您在本地运行该程序并且可以正常工作时,您是说它可以使用客户端计算机中的同一终端在本地运行某些程序,或者在服务器计算机中本地运行终端模拟器吗?我想知道您是否正在使用一些试图从Windows世界模仿Ctrl + C的模拟器...
njsg 2012年

Answers:


5

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“键盘中断”发送到您从终端运行的程序。

完全由程序来处理该信号,它可以针对它执行任何操作。许多脚本语言解释器可以通过终止被调用的脚本并正常退出来以默认方式处理此问题。

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

kill -15 <pid>

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

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

kill -9 <pid>

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


3

这是一些核心技巧:

Control-Z

它将暂停您的流程,并将返回该流程的工作ID

然后:

kill -9 %1

(用您的工作ID替换1)。

注意:百分比是强制性的!否则,您将终止您的init进程,这意味着您将终止内核,整个系统将崩溃(因此,请不要在两者之间加空格:)


0

Ctrl + c不会终止该进程。它只会在中间停止当前正在运行的进程。要杀死该进程,我们需要使用“ KILL”命令


7
实际上会kill向过程发送信号。不会杀死它。与一起发送的默认信号killTERM,与一起发送的信号ctrl+cSIGINT
fmanco

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.