인터럽트 쉘 명령줄 확장

인터럽트 쉘 명령줄 확장

경고: 의미를 이해하지 않고 이 질문에 나열된 명령을 시도하지 마십시오.

중복이라면 죄송합니다. 명령이 너무 간단해서 놀랐어요

echo $(yes)

컴퓨터가 멈춥니다. (실제로는 컴퓨터가 멈춘 것이 아니라 심하게 ​​렉이 걸리는데, 그 렉은 컴퓨터가 죽었다고 생각할 만큼 충분합니다.) 이 명령을 입력한 후 즉시 해당 명령을 입력하거나 CtrlC입력 CtrlZ하는 것은 잘못 입력한 명령을 복구하는 데 도움이 되지 않는 것 같습니다.

반면에

ls /*/../*/../*/../*/../*/

컴퓨터가 최적의 성능보다 심각하게 지연되고 최악의 경우 충돌을 일으킬 수도 있는 잘 알려진 취약점입니다.

이 명령은 잘 알려진 포크 폭탄과 매우 다릅니다.

내 질문은 다음과 같습니다셸에서 실행을 시작한 직후 이러한 명령을 중단하여 수많은 셸 명령줄 옵션을 즉시 생성할 수 있는 방법이 있습니까?

내가 이해한 바는 명령이 실행되기 전에 쉘 확장이 완료되기 때문에 지연이 발생할 때 명령이 실행되지도 않기 때문에 명령을 중단하는 일반적인 방법이 작동하지 않는다는 것입니다. 그러나 또한 내 이해가 올바른지 확인하고 싶습니다. 그리고 너무 많은 메모리를 사용하기 전에 쉘 확장을 취소할 수 있는 방법을 알고 싶습니다.

메모리가 부족한 상황에서 커널이 어떻게 작동하는지 찾고 있지 않습니다. 나는 또한 SysRq시스템이 이미 심각하게 지연되고 있을 때 도움이 될 수 있는 과잉을 찾고 있지 않습니다 . 또한 ulimit기억 부여와 같은 예방 방법을 찾고 있는 것도 아닙니다 . 시스템이 지연되기 전에 셸 자체 내에서 대규모 셸 확장 프로세스를 효율적으로 취소할 수 있는 방법을 찾고 있습니다. 그것이 가능한지 모르겠습니다. 댓글대로 불가능할 경우, 설명과 함께 답변을 남겨주세요.

일반적인 답변을 원했기 때문에 원래 질문에 시스템 관련 정보를 포함하지 않기로 결정했습니다. 하지만 중요한 경우를 대비해 내 시스템에 대한 정보는 다음과 같습니다. 및 을 Ubuntu 16.04.4 LTS사용하여 시스템 실행 . 가상 머신은 관련되지 않습니다.gnome-terminalbash 4.3.48(1)x86_64

답변1

현재로서는 GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)가상 머신을 사용하고 있지 않습니다.

echo $(yes) 

쉘이 존재하고 시스템이 정지되지 않으며 다음을 수행합니다.

ls /*/../*/../*/../*/../*/

반품

bash: /bin/ls: Argument list too long

그러나 일반적으로 시스템의 모든 리소스를 사용할 수 있는 작업을 처리할 때는 실행하기 전에 제한을 설정하는 것이 가장 좋습니다. 프로세스가 CPU 집약적일 수 있다는 것을 알고 있는 경우 를 사용하여 cpulimit시작하거나 실행할 수 있습니다 renice.

이미 시작된 프로세스를 제한하려면 PID별로 하나씩 수행해야 하지만 배치 스크립트를 사용하면 다음과 같이 수행할 수 있습니다.

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

내 경우에는 pypdfocrgreedy 를 시작하세요 tesseract.

또한 어떤 경우에는 CPU가 정말 좋다면 renice다음과 같이 사용할 수 있습니다.

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'

관련 정보