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

이 잘못된 명령은 내 질문의 항목이 아닙니다(나는 내가 무엇을 시도하고 있는지, 다음 단계가 무엇인지 알고 있습니다).

항목은 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내용이 줄어 듭니다. Less를 닫으면 모든 것이 괜찮은 것처럼 bash 프롬프트에 있습니다. 그리고 다른 터미널에는 ps -Flwwc ...모든 것이 괜찮은 것처럼 표시됩니다. 두 하위 프로세스는 사라지고 맨 아래 프로세스는 깨진 bash입니다.

이제 깨진 bash로 돌아갑니다. 입력하거나 - Return을 입력하면 두 줄의 끝없는 시퀀스가 ​​표시되고 다른 터미널에는 두 하위 프로세스가 다시 표시됩니다.CtrlCps -Flwwc ...

writevt또한 I send를 통해 while 루프의 다른 터미널에서 가능한 한 가장 짧은 연속으로 Ctrl보내는 경우 C도움이 되지 않습니다.

일반적인 방법으로 crasy bash를 중지할 수 있는 방법은 없습니다.

내가 아는 유일한 방법은 깨진 bash를 죽이는 것입니다. 그러나 이로 인해 bash 기록이 손실됩니다.

(다른 응용 프로그램의 경우 bash PROMPT_COMMAND ...를 사용하여 만들지만 history -a여기서는 해당 항목이 아닙니다.)

bash의 이러한 동작 이유와 이 새로운 동작을 방지하는 방법을 아는 사람이 있습니까?

답변1

찾은 설명 및 해결 방법:

/dev/pts/nn마지막으로 히스토리 파일에 추가로 기록하기 위해 다양한 종류의 PROMPT_COMMAND를 실험해 보았습니다 .

잘못된 코드는 테스트에서 PROMPT_COMMAMD의 구성 요소였습니다.

따라서 하위 프로세스를 종료한 후에는 모든 것이 정상인 것처럼 보입니다. 실제로 모든 것이 정상이었습니다.

그런 다음 깨진 bash에서 새로운 프롬프트를 유발하는 무언가를 제공했을 때 PROMPT_COMMAND 내에서 잘못된 코드가 실행되었습니다. 따라서 하위 프로세스가 다시 생성되었습니다.

해결책은 깨진 bash에 명령을 제공하는 것입니다.

unset PROMPT_COMMAND

그러면 bash의 "광기"가 멈춥니다.

그래서 내 질문을 삭제할 수 있었습니다. 그러나 일부 요점은 다른 사람들이 읽을 가치가 있기 때문에 그렇게 하지 않습니다. 특히 한 가지 요점은 공개로 유지되어야 합니다.

Linux에서는 명령을 사용하는 것이 중요합니다 writevt. 모든 Linux 배포판의 일반적인 명령이 되도록 다시 개발되어야 합니다.

관련 정보