在 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
我看到有两个子进程处于活动状态:
sed
(如上图)less
两者的 PPID 都是损坏的 bash。
在破碎的重击中没有办法。例如
输入Returnless 并显示其内容。关闭 less,我进入了 bash 提示符,一切似乎都正常。另一个终端ps -Flwwc ...
显示一切似乎都正常:两个子进程消失了,底部进程是损坏的 bash。
现在回到损坏的 bash:如果我输入Return或者输入Ctrl- C,我会得到两行的无限序列,并且在另一个终端ps -Flwwc ...
再次显示两个子进程。
此外,如果我从另一个终端在while循环中以最短的可能连续时间通过writevt
I发送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 发行版的常规命令。