如何在 WSL 下终止失控的控制台进程?

Tum*_*d53 5 command-line windows-subsystem-for-linux

我在运行命令时犯了错误:

cat /dev/urandom

控制台(托管在 Windows 上)充满了垃圾并停止响应Ctrl-Z或其他任何内容。

有什么办法可以恢复控制台吗?

pa4*_*080 1

首先,我想强调+和+之间存在显着差异ctrlzctrlc

  • ctrl+z将 SIGTSTP 发送到前台进程,有效地将其置于后台 - 在这种情况下不合适。
  • ctrl+c发送 SIGINT,这将中断进程,这是您应该首先尝试的。

有关信号的更多信息,您可以阅读man 7 signal

有时,仅仅关闭终端窗口并不是最好的解决方案,因为您将丢失对您来说可能很重要的最近历史记录。

通过打开另一个终端窗口(或真实 Linux 中的 TTY),您可以尝试cat使用以下任一命令来终止该进程。

killall -s 9 cat
Run Code Online (Sandbox Code Playgroud)

该命令killall按名称杀死进程,并将尝试杀死所有cat进程。该选项-s 9将发送 SIGKILL 而不是 SIGTERM ,它可以被解读为强制终止。大多数情况下就killall cat足够了。

kill -9 $(ps -e | awk '/cat/ {print $1}')
Run Code Online (Sandbox Code Playgroud)

该命令kill将向进程发送信号,并且通过选项-9我们将像上面的命令一样发送 SIGKILL,但这里我们必须提供 PID(进程标识符)而不是名称。命令替换将提供系统上运行的$()所有进程的列表。cat这是山楂:

  • ps -e将列出系统上所有正在运行的进程,
  • 该列表将|作为命令的输入通过管道传输awk
  • 最后将通过打印包含字符串的每行的awk '/cat/ {print $1}'第一个字段来过滤列表。第一个字段包含相关进程的 PID。$1cat

请注意,您不需要使用这两个命令,因为通常您的用户应该是进程sudo的所有者。cat