
В 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
и я вижу, что активны два дочерних процесса:
sed
(как показано выше)less
PPID обоих — это сломанный bash.
В сломанном Баше нет средств. Например
Ввод текста Returnприносит меньше с его содержимым. Закрывая меньше, я в приглашении 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
Тогда «безумие» Баша прекращается.
Поэтому я мог бы удалить свой вопрос. Но я этого не делаю, потому что некоторые пункты стоит прочитать другим, особенно один пункт должен оставаться публичным:
Важно иметь в Linux команду writevt
. Ее следует переизобрести, чтобы она стала обычной командой каждого дистрибутива Linux.