최근에 GNU / Linux의 프로세스에 대한 정보를 파헤쳐 서 악명 높은 포크 폭탄을 만났습니다.
:(){ : | :& }; :
이론적으로 시스템에 리소스가 부족할 때까지 자체 복제됩니다.
그러나 CLI 데비안 과 GUI 민트 배포판 모두에서 테스트를 시도했지만 시스템에 많은 영향을 미치지 않는 것 같습니다. 예, 수많은 프로세스가 생성되며 잠시 후 다음과 같은 콘솔 메시지를 읽습니다.
bash : 포크 : 리소스를 일시적으로 사용할 수 없음
배쉬 : 포크 : 재시도 : 자식 프로세스 없음
그러나 얼마 후 모든 프로세스가 중단되고 모든 것이 정상으로 돌아옵니다. ulimit가 사용자 당 최대 프로세스 수를 설정 한 것을 읽었 지만 실제로 그것을 높일 수없는 것 같습니다.
포크 폭탄에 대한 시스템 보호는 무엇입니까? 왜 모든 것이 얼어 붙거나 적어도 많이 지연 될 때까지 스스로 복제되지 않습니까? 포크 폭탄으로 시스템을 실제로 충돌시키는 방법이 있습니까?
답변
systemd를 사용하는 Linux 배포판이있을 것입니다.
Systemd는 각 사용자에 대한 cgroup을 만들고 사용자의 모든 프로세스는 동일한 cgroup에 속합니다.
Cgroups는 최대 프로세스 수, CPU주기, RAM 사용량 등과 같은 시스템 리소스에 대한 제한을 설정하는 Linux 메커니즘입니다. 이는 syscall ulimit
을 사용 하는 것과는 다른,보다 현대적인 리소스 제한 레이어입니다 getrlimit()
.
실행하면 systemctl status user-<uid>.slice
(사용자의 cgroup을 나타냄 ) 해당 cgroup 내에서 허용되는 현재 및 최대 작업 수 (프로세스 및 스레드)를 볼 수 있습니다.
$ systemctl 상태 사용자-$ UID.slice ● user-22001.slice-UID 22001의 사용자 조각 로드 됨 :로드 됨 드롭 인 : /usr/lib/systemd/system/user-.slice.d └─10-defaults.conf 활성화 : 월요일부터 활성화 2018-09-10 17:36:35 EEST; 1 주일 전 작업 : 17 (한계 : 10267) 메모리 : 616.7M
기본적으로 systemd가 각 사용자에게 허용하는 최대 작업 수는 “시스템 전체 최대”( sysctl kernel.threads-max
) 의 33 %입니다 . 이것은 일반적으로 ~ 10,000 개의 작업에 해당합니다. 이 한계를 변경하려면 다음을 수행하십시오.
-
systemd v239 이상에서 사용자 기본값은 다음에서 TasksMax = 를 통해 설정됩니다 .
/usr/lib/systemd/system/user-.slice.d/10-defaults.conf
특정 사용자에 대한 제한을 조정하려면 (/etc/systemd/system.control에 저장 될뿐만 아니라 즉시 적용됨) 다음을 실행하십시오.
systemctl [--runtime] set-property user-<uid>.slice TasksMax=<value>
여기에서 장치 설정을 재정의하는 일반적인 메커니즘 (예 :)도
systemctl edit
여기에서 사용할 수 있지만 재부팅해야합니다. 예를 들어 모든 사용자에 대한 제한을 변경 하려면을 만들 수 있습니다/etc/systemd/system/user-.slice.d/15-limits.conf
. -
systemd v238 및 이전 버전에서는 사용자 기본값이 에서 UserTasksMax = 를 통해 설정됩니다
/etc/systemd/logind.conf
. 값을 변경하려면 일반적으로 재부팅해야합니다.
이것에 대한 자세한 정보 :
답변
어쨌든 현대 리눅스 시스템은 더 이상 충돌하지 않습니다.
많은 프로세스를 생성하지만 프로세스가 유휴 상태가 될 때 CPU를 많이 소모하지는 않습니다. RAM이 부족하기 전에 프로세스 테이블에 슬롯이 부족합니다.
Hkoof가 지적한 것처럼 cgroup이 제한되지 않은 경우에도 다음 변경으로 인해 시스템이 다운됩니다.
:(){ : | :& : | :& }; :
답변
90 년대로 돌아가서 우연히이 중 하나를 스스로에게 공개했습니다. fork () 명령이있는 C 소스 파일에서 실수로 실행 비트를 설정했습니다. 두 번 클릭하면 csh가 원하는대로 편집기에서 열지 않고 실행하려고했습니다.
그럼에도 불구하고 시스템이 충돌하지 않았습니다. Unix는 계정 및 / 또는 OS에 프로세스 제한이있을 정도로 강력합니다. 대신에 매우 느리게 진행되므로 프로세스를 시작해야하는 모든 것이 실패 할 수 있습니다.
배후에서 일어나는 일은 프로세스 테이블이 새로운 프로세스를 생성하려는 프로세스로 채워진다는 것입니다. 프로세스 테이블이 가득 차서 포크에 오류가 발생하거나 절망적 인 운영자가 시스템에 정신을 복원하려고 시도하여 프로세스 중 하나가 종료되면 다른 프로세스 중 하나가 새 프로세스를 즐겁게 포크합니다. 공극.
“포크 폭탄”은 기본적으로 프로세스 테이블을 가득 채우는 미션에서 의도하지 않은 자체 복구 프로세스 프로세스입니다. 그것을 막을 수있는 유일한 방법은 어떻게 든 그들을 한 번에 죽일 것입니다.