Fork Bomb 메모리 부족 오류를 중지하는 방법 - RHEL 6

Fork Bomb 메모리 부족 오류를 중지하는 방법 - RHEL 6

포크 폭탄의 효과를 테스트하기 위해 테스트 VM을 설정했습니다. 그래서 사용자를 limits.conf위해 다음과 같이 편집했습니다 root.

root    hard         nproc  512

이제 다음과 같이 포크 폭탄을 떨어뜨립니다.

:(){ :|:& };:

그 후 잠시 후(512 제한에 도달하는 데 걸리는 것으로 생각됨) 다음 오류가 표시됩니다. 예

이는 멈추지 않고 계속됩니다. 기계를 재부팅하지 않고 이를 중지할 수 있습니까?

답변1

기계를 재부팅하지 않고 이를 중지할 수 있습니까?

완전히 불가능한 것은 아니며 운이 좋으면 할 수 있습니다. 즉, 다른 프로세스가 생성되기 전에 모든 프로세스를 종료할 수 있습니다. 1 하지만 매우 운이 좋아야 하기 때문에 믿을만하거나 가치 있는 노력이 아닙니다.[어쩌면 slm이 나보다 운이 좋을지도 모르지, ㅋㅋㅋ -- TBH 그렇게 열심히 노력해 본 적은 없어.]. 우선순위를 가지고 놀면 확률이 높아질 수 있지만(참조 man nice), 이것이 포크 폭탄의 효율성을 망칠 수도 있다고 생각합니다.

더 나은 아이디어는 시간이 초과되는 것을 사용하는 것입니다. C의 예를 보려면 각주 5번을 참조하세요.내 대답은 여기. 2 쉘 스크립트로 동일한 작업을 수행할 수 있지만 다음과 같이 짧지는 않습니다 :(){ :|:& };:.

#!/bin/bash

export fbomb_duration=$1
export fbomb_start=$(date +%s)

go () {
    now=$(date +%s)
    if [[ $(($now-$fbomb_start)) -gt $fbomb_duration ]]
        then exit 0;
    fi
    go &
}

while ((1)); do
    go
done           

하나의 인수(초)로 실행합니다. 그 시간이 지나면 모든 포크가 죽습니다.

1 실제로 커널 OOM 킬러가 운이 좋다면 결국에는 저절로 일어날 수 있습니다. 그러나 숨을 참지 마십시오.

2 특정 폭탄을 햄스트링하는 데 사용되는 방법( 설정을 통해 vm.overcommit_memory=2)은 일반적으로 거의 작동하지 않지만 시도해 볼 수는 있습니다. 지금은 시스템을 계속 실행하고 싶기 때문에 그렇지 않습니다. ;)

답변2

이 질문에 대한 답변을 개발하는 동안 다음과 같은 제목이 붙었습니다.포크 폭탄의 포크()는 어디에 있습니까 :(){ :|: & };:?, 나는 죽이기 더 쉬운 퓨즈 지연 포크 폭탄이라고 부르는 것을 구성했습니다.

또한 해당 답변을 개발하는 동안 정기적으로 모든 프로세스를 종료하여 포크 폭탄을 중지할 수 있었습니다. 예상했던 것보다 더 쉽고 반복 가능했습니다.

사용된 방법

그 답변을 쓴 지 꽤 시간이 지났기 때문에 지금은 100% 확신할 수는 없지만 머리로는 이 방법을 사용하고 있었던 것 같습니다.

$ pkill -f :

프로세스를 기다리는 동안 잠시 멈췄지만 결국에는 실행할 수 있었습니다. 또한 포크 폭탄을 시작하기 전에 상위 프로세스 ID를 기록하고 이 작업도 수행합니다.

$ pkill -P <PPID>

이는 포크 폭탄이 실행된 상위 프로세스 ID(PPID)입니다. 이 방법을 사용하면 모든 하위 프로세스가 중단되어 모두 계단식으로 진행되어 종료됩니다.

답변3

나는 당신이 대답에서 제안한대로 할 수 있다고 믿습니다여기쉘에 접근할 수 있다고 가정합니다.

killall -STOP -u user1
killall -KILL -u user1

관련 정보