Bash постоянно генерирует дочерние процессы и не может быть остановлен. Что происходит?

Bash постоянно генерирует дочерние процессы и не может быть остановлен. Что происходит?

В Kubuntu 20.04 или KNOPPIX 9.1, в KDE под Konsole много окон и в каждом bash версии 5.2.15(1)-release (i686-pc-linux-gnu).

Проблема, описанная в этом вопросе, часто возникала у меня в последние несколько недель (но никогда раньше).

Это всегда вызвано неправильной командной строкой в ​​исходном скрипте или введенной после приглашения оболочки.

Иногда (не сегодня) bash бесконечно создает новые процессы.

Сегодня я могу сообщить о ложной командной строке, которая и является причиной — это не буквально то, что я набрал, а то, что показывает ps:

ps -Flwwc -t pts/14

ps показывает в столбце "CMD":

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

Обратите внимание, что эта ложная команда не является предметом моего вопроса (я знаю, что пытаюсь сделать и каковы следующие шаги).

Суть в том, что делает Crazy Bash и в чем заключается помощь.

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.

В сломанном Баше нет средств. Например

Ввод текста Returnприносит меньше с его содержимым. Закрывая меньше, я в приглашении 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

Тогда «безумие» Баша прекращается.

Поэтому я мог бы удалить свой вопрос. Но я этого не делаю, потому что некоторые пункты стоит прочитать другим, особенно один пункт должен оставаться публичным:

Важно иметь в Linux команду writevt. Ее следует переизобрести, чтобы она стала обычной командой каждого дистрибутива Linux.

Связанный контент