포크 폭탄의 효과를 테스트하기 위해 테스트 VM을 설정했습니다. 그래서 사용자를 위해 limits.conf
다음과 같이 편집했습니다 .root
root hard nproc 512
이제 다음과 같이 포크 폭탄을 떨어뜨립니다.
:(){ :|:& };:
그런 다음 얼마 후(512 제한에 도달해야 한다고 생각함) 다음 오류가 발생합니다.
이것은 계속해서 진행됩니다. 컴퓨터를 다시 시작하지 않고 이를 중지할 수 있는 방법이 있습니까?
답변1
컴퓨터를 다시 시작하지 않고 이를 중지할 수 있는 방법이 있습니까?
완전히 불가능한 것은 아닙니다. 운이 좋으면 할 수 있습니다. 즉, 다른 프로세스가 생성되기 전에 모든 프로세스를 종료할 수 있습니다. 1 그러나 당신은 아주 아주 운이 좋아야 하기 때문에 그것은 신뢰할 만하거나 가치 있는 노력이 아닙니다.[아마도 slm이 나보다 운이 좋을지도 모르지, 하하 - 솔직히 아직 그렇게 열심히 노력하진 않았어]. 우선 순위 지정(참고자료 참조)에 대해 생각하면 가능성이 높아질 수 있지만 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 킬러가 운이 좋다면 결국에는 저절로 일어날 수도 있습니다. 그러나 숨을 참지 마십시오.
특정 폭탄을 제한하는 두 가지vm.overcommit_memory=2
방법(설정을 통해 )은 일반적으로 거의 작동하지 않지만 시도해 볼 수 있습니다. 그렇지 않습니다. 지금은 시스템을 계속 실행하고 싶기 때문입니다. ;)
답변2
이 질문에 대한 답을 공식화하면서 제목은 다음과 같습니다.포크 폭탄의 포크()는 어디에 있습니까:(){ :|: & };:?, 나는 더 쉽게 죽일 수 있도록 퓨즈 지연 포크 폭탄이라고 부르는 것을 구성했습니다.
또한 이 답변을 개발하는 동안 모든 프로세스를 종료하여 포크 폭탄을 막을 수 있었던 경우가 많았습니다. 예상했던 것보다 더 쉽고 반복 가능했습니다.
사용 지침
이 답변을 쓴 지 꽤 시간이 지났기 때문에 지금은 100% 확신할 수 없지만 다음과 같은 접근 방식을 사용하고 있다는 생각이 들었습니다.
$ pkill -f :
프로세스를 기다리는 동안 잠시 정지되지만 결국에는 실행될 수 있습니다. 또한 포크 폭탄을 실행하기 전에 상위 프로세스 ID를 기록하고 다음을 수행합니다.
$ pkill -P <PPID>
이는 포크 폭탄이 실행되는 상위 프로세스 ID(PPID)입니다. 이 방법은 모든 하위 프로세스를 종료하여 모두 계단식으로 진행되어 종료됩니다.
답변3
나는 당신이 답변의 제안을 따를 수 있다고 믿습니다여기쉘에 액세스할 수 있다고 가정합니다.
killall -STOP -u user1
killall -KILL -u user1