Bash 不断生成子进程,无法停止。发生了什么?

Bash 不断生成子进程,无法停止。发生了什么?

在 Kubuntu 20.04 或 KNOPPIX 9.1 中,在 KDE 中的 Konsole 下的许多窗口以及在每个 bash ver 5.2.15(1)-release (i686-pc-linux-gnu) 中。

这个问题描述的问题我在过去几周经常遇到(但以前从未遇到过)。

它总是由源脚本中的错误命令行或在 shell 提示符后输入的错误命令行引起的。

有时(不是今天)bash 会无休止地分叉新的进程。

今天我可以报告导致错误的命令行——它不是我输入的内容,而是 ps 显示的内容:

ps -Flwwc -t pts/14

ps 在“CMD”栏显示:

sed -r eval s=(.*)=\1; ZZZZZZZZZ;=p /root/.bash_history

请注意,这个错误命令不是我的问题(我知道我在尝试什么以及下一步是什么)。

项目是,疯狂的抨击会做什么以及有什么帮助。

bash 不断连续显示这两行:

sh -c: line 1: syntax error near unexpected token `('

sh -c: line 1: `val s=(.*)=1; ZZZZZZZZZ;=p'

在另一个终端的 bash 中我运行

ps -Flwwc --sort=start_time -t pts/14

我看到有两个子进程处于活动状态:

  1. sed(如上图)
  2. less

两者的 PPID 都是损坏的 bash。

在破碎的重击中没有办法。例如

输入Returnless 并显示其内容。关闭 less,我进入了 bash 提示符,一切似乎都正常。另一个终端ps -Flwwc ...显示一切似乎都正常:两个子进程消失了,底部进程是损坏的 bash。

现在回到损坏的 bash:如果我输入Return或者输入Ctrl- C,我会得到两行的无限序列,并且在另一个终端ps -Flwwc ...再次显示两个子进程。

此外,如果我从另一个终端在while循环中以最短的可能连续时间通过writevtI发送Ctrl-C等,则没有帮助。

没有办法以正常方式阻止这场疯狂的袭击。

我知道的唯一方法是杀死损坏的 bash。但这会导致丢失 bash 历史记录。

(对于其他应用程序我使用 bash PROMPT_COMMAND ... 来制作history -a,但这不是这里的项目)。

有人知道 bash 这种行为的原因以及如何防止这种新行为吗?

答案1

找到解释和解决方案:

最近,我正在对各种 PROMPT_COMMAND 进行实验,以便将其另外写入历史文件/dev/pts/nn

错误的代码是测试中的 PROMPT_COMMAMD 的一个组成部分。

因此,在终止子进程后,一切似乎都正常,事实上一切正常。

然后,当我在损坏的 bash 中输入导致新提示的内容时,错误的代码在 PROMPT_COMMAND 中执行。因此再次创建了子进程,等等。

解决方案是:给损坏的 bash 命令

unset PROMPT_COMMAND

然后 bash 的“疯狂”就停止了。

所以我可以删除我的问题。但我不会,因为有些观点值得其他人阅读,尤其是有一点应该保持公开:

在 Linux 中,命令 非常重要writevt。它应该被重新发明,成为每个 Linux 发行版的常规命令。

相关内容