포크 폭탄을 청소하는 가장 좋은 방법은 무엇입니까?


21
$ ls
bash: no more processes

어 오. 누군가가 포크 폭탄을 만든 것 같습니다. 내가 일했던 곳에서 이것은 공유 서버의 전원을 껐다 켜야한다는 것을 의미했습니다. 왜냐하면 루트가있는 sysadmin조차도 종종 문제를 해결할 수 없었기 때문입니다. 종종 그들은 심지어 프롬프트를 얻지 못했습니다.

나는 몇 가지 트릭을 (즉시 죽인 사람을 대체 할 수있는 후자 나머지 스레드를 허용 것이기 때문에 특히, STOP 신호가 아니라 KILL 신호를 보내) 들었지만, 내가 포괄적 인 가이드라는 제목 본 적이 그래서, 당신은 자신을 가지고 포크 폭탄?

하나 만들어 봅시다.

답변:


10

ulimit를 사용하여 합리적인 사용자 당 프로세스 제한으로 포크 폭탄이 프로세스 제한을 소진하지 않도록하십시오 .

이렇게하면 한 명의 사용자가 시스템 제한에 도달하기 오래 전에 프로세스 할당량을 소진합니다.


6

가장 먼저 시도 할 것은 로그인 한 사용자를 로그 아웃하는 것입니다. 쉘이 모든 분기를 수행하는 프로세스의 상위 프로세스 일 수 있으며 이로 인해 문제점이 종료 될 수 있습니다.

그래도 작동하지 않으면 kill -STOP -2루트로 실행 하여 루트 이외의 다른 사용자로 실행중인 모든 프로세스를 고정 할 수 있습니다. 그래도 kill -CONT <pid>문제가 해결되면 포크 폭탄과 관련이없는 알려진 프로세스를 고정 해제하고 프로세스 테이블 문제 전체를 제거하기 위해 프로세스를 종료하고 문제의 원래 원인을 추적하고 제거 할 수있는 호흡 공간을 제공 할 수 있습니다. Sendmail은 pid를 식별하기 위해 .pid 파일을 사용하여 쉽게 식별 할 수 있으므로 시스템 프로세스를 종료시키는 좋은 예입니다. 예를 들면 다음과 같습니다 kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid).


킬에 대한 "-2"옵션은 무엇입니까? Linux의 맨 페이지에 표시되지 않습니다.
raldi

1
이것은 pid에 음수 값을 지정할 때 대부분의 OS에서 작동합니다. <pid>가 -1보다 작 으면 프로세스 그룹-<pid>의 모든 프로세스로 kill이 전송됩니다. STOP sig를 pid -2로 보내면 특수 시스템 프로세스 또는 루트 소유 프로세스가 아닌 모든 프로세스를 중지해야합니다.

"negative pid"를 죽이려면 kill (2) 맨 페이지를 참조하십시오. 그러나 여전히 이것이 효과가 있다고 생각하지 않습니다. 초기화되지 않은 모든 프로세스가 그룹 2에있는 이유는 무엇입니까? 나는 그것을 중지 한 결과가 종종 매우 치명적이기 때문에 init를 피하고 싶다는 것을 이해합니다.
ephemient

@ephemient, 2는 프로세스 그룹 ID가 되기에는 너무 낮으므로 다른 특별한 값일 수 있습니다.
joshudson


3

생성 kill에 사용 가능한 프로세스 핸들이 필요하기 때문에 STOP 신호를 어떻게 보낼 수 있는지 잘 모르겠습니다 . 또한 내 경험에 따르면 프로세스가 부족하기 전에 시스템이 과부하되어 사용할 수 없게됩니다.

?로 사용자 별 프로세스 제한을 시행하는 것을 고려 했습니까 ulimit? 이렇게하면 사용자가 포크 폭탄을 실수로 시작하지 못할 수 있습니다.


3
kill은 적어도 bash에 내장 된 쉘입니다.
raldi

1
이것이 핵심 구성 요소라고 생각합니다. 선택한 쉘의 내장을 식별하십시오.

2
내장되어 있지 않으면 "exec kill PID"를 실행할 수 있습니다. 그러나 작동하지 않으면 다른 쉘을 얻지 못할 수 있으므로 위험합니다. 그것을 시스템 관리에 대한 벌침 접근 방식으로 생각하십시오!
Stephen Darlington

2

일부 BSD 시스템은 루트를 위해 마지막 5 개 정도의 프로세스를 예약 할 수 있습니다. 아마도 당신의 시스템은 그 능력을 가지고있을 것입니다.


3
실제로이를 위해 시스템을 어떻게 구성합니까?
Nik Reiman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.