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

$ ls
bash: no more processes

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

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

하나 만들어 봅시다.



답변

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

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


답변

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

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


답변

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

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


답변

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


답변