Bash は子プロセスを永続的に生成し、停止できません。何が起こっているのでしょうか?

Bash は子プロセスを永続的に生成し、停止できません。何が起こっているのでしょうか?

Kubuntu 20.04 または KNOPPIX 9.1、KDE ​​の Konsole の複数のウィンドウ、および各 bash バージョン 5.2.15(1) リリース (i686-pc-linux-gnu)。

この質問で説明されている問題は、ここ数週間で頻繁に発生していました (以前は一度もありませんでした)。

これは常に、ソース スクリプト内の間違ったコマンド ライン、またはシェル プロンプトの後に入力されたコマンド ラインによって発生します。

時々 (今日ではありませんが)、bash は新しいプロセスを無限にフォークします。

今日、原因となっている誤ったコマンド ラインを報告できます。これは私が入力した内容そのものではなく、ps に表示される内容です。

ps -Flwwc -t pts/14

ps は列「CMD」に表示されます:

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

この誤ったコマンドは私の質問の項目ではないことに注意してください (何を試みているのか、次の手順は何かはわかっています)。

アイテムは、クレイジーバッシュが何をするのか、そしてヘルプは何かということです。

bash は次の 2 行を無限に続けて表示します。

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

2 つの子プロセスがアクティブであることがわかります。

  1. sed(上記の通り)
  2. less

両方の PPID は壊れた bash です。

壊れたbashでは手段はありません。例

入力するとReturn、less とその内容が表示されます。less を閉じると、すべてが正常であるかのように bash プロンプトが表示されます。そして、もう一方のターミナルでは、すべてが正常であるps -Flwwc ...かのように表示されます。2 つの子プロセスは消え、下のプロセスは壊れた bash です。

ここで、壊れた bash に戻ります。Returnまたはと入力するCtrlC、2 行の無限シーケンスが表示され、他のターミナルにps -Flwwc ...2 つの子プロセスが再び表示されます。

また、while ループ内の別の端末からwritevtI send Ctrl-Cなどを可能な限り短い連続で送信する場合も、役に立ちません。

通常の方法でこの狂った暴行を止める方法はありません。

私が知っている唯一の方法は、壊れた bash を強制終了することです。しかし、これにより bash の履歴が失われます。

(他のアプリケーションでは、bash PROMPT_COMMAND ... を使用して作成しますhistory -aが、ここではその項目ではありません)。

bash のこの動作の理由と、この新しい動作を防ぐ方法を知っている人はいますか?

答え1

説明と解決策が見つかりました:

最近、履歴ファイルに追加で/dev/pts/nn書き込むために、さまざまな種類の PROMPT_COMMAND を試しています。

間違ったコードは、テストの PROMPT_COMMAMD のコンポーネントでした。

したがって、子プロセスを終了した後はすべて正常であるように見えますが、実際はすべて正常でした。

その後、壊れた bash で新しいプロンプトを引き起こす何かを入力すると、PROMPT_COMMAND 内で間違ったコードが実行されました。そのため、子プロセスが再度作成されるなどしました。

解決策は、壊れたbashにコマンドを与えることです

unset PROMPT_COMMAND

すると、bash の「狂気」は止まります。

質問を削除することもできました。しかし、いくつかの点は他の人に読んでもらう価値があるため、特に次の 1 つの点は公開したままにしておく必要があるため、削除しません。

Linux に コマンドがあることは重要ですwritevt。これは、すべての Linux ディストリビューションの標準コマンドになるように再発明されるべきです。

関連情報