我知道有ctrl+ c,但有时它不起作用。在 Ubuntu 桌面中,当发生这种情况时,我只能关闭终端窗口并打开一个新窗口,但如何使用 Ubuntu 服务器中的 CLI 解决这个问题(无需重新启动机器)?
答案1
CTRL+C将发送SIGINT
给应用程序。应用程序可以为此信号配置处理程序,也可以忽略该信号。默认情况下没有处理程序,SIGINT
将终止应用程序。
您可以使用CTRL+\来发送SIGQUIT
。如果核心限制不为零,这还将生成核心转储。
CTRL您可以使用+暂停该过程并返回到 shell Z,这将停止进程的执行并返回到 shell 提示符。进程将位于内存中,并将作为当前 shell 中的作业可用。然后您可以使用kill -SIGNAL %%
或kill -SIGNAL %<job_ID>
向该作业发送信号。例如,要终止最后一个作业,请使用kill -9 %%
如果它们都不起作用SIGTERM
,那么作为最后的手段,您可以随时发送 ,SIGKILL
这将终止任何进程。此信号与任何其他信号一样,必须以与您要停止的进程相同的用户或 root 身份发送。要发送到进程,首先使用或SIGKILL
找到进程,然后运行,其中是输出中的列。ps aux
ps -edf
kill -SIGKILL <process_ID>
<process_ID>
PID
ps
如果进程处于不可中断调用中,则无法传递信号。不可中断调用是无法停止的内核函数,通常是由于驱动程序有问题(例如,驱动程序没有可重入的)的过程不间断睡眠直到调用完成或服务器重新启动后才能停止。这些信号将保留在待处理 (Pnd) 信号列表中。可以使用以下命令显示进程的待处理信号小脚本那只是从中获取它们/proc/<PID>/status
。
如果某个流程变成僵尸,它不会使用任何资源,只占用进程表的空间。僵尸进程无法接收信号。
当前架构的信号列表可以通过以下方式找到kill -l
kill
请参阅、ps
和的手册页bash
。要查看手册页,请使用以下命令:man ps
答案2
如果您拥有完全控制台访问权限,您可以执行此操作Alt并F1..12获取一个新的控制台。
从那里,您可以执行如下流程列表:
ps aux | grep <process-name>
kill
然后对进程 ID执行:
kill -9 <pid>
如果您没有完全的控制台访问权限,只需打开另一个终端窗口(可能通过 PuTTY 或类似程序),然后执行上述进程列表和终止步骤。
答案3
Ctrl C 向正在运行的进程发送 SIGINT。如果您不想打开另一个控制台,可以使用 Ctrl \ 发送 SIGQUIT。这将解决 SIGINT 无法解决的大多数日常应用程序挂起问题。
我个人想要一种使用快捷方式发送 SIGKILL 的方法,但我不知道如何做到这一点。
答案4
回答
Cntrl+\对我有用(其中Cntrl+c或z无效)
可选阅读
当 Ubuntu 16.04 在我的 Lenovo Thinkpad E470 中冻结时,我通常会按照以下步骤操作。
- 进入无 GUI 模式 ( ++ Cntrl) 。AltF1
- 使用
top
命令查看哪个进程的 CPU 使用率较高(高于 50% 左右)。记下该进程的 PID。 - 退出
top
指令(按q)。 - [仅当您知道
kill
命令时] 使用 终止进程kill -9 <process ID you noted down>
。 - 返回 UI 模式( Cntrl++ Alt)F7