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

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

我错误地运行了以下命令:

cat /dev/urandom

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

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

答案1

首先,我想强调的是不同之处介于ctrl+zctrl+之间c

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

更多有关信号的信息,请访问man 7 signal

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

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

killall -s 9 cat

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

kill -9 $(ps -e | awk '/cat/ {print $1}')

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

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

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

相关内容