“: () {: | : &} ;:”명령으로 시스템이 너무 느려 재부팅해야했던 이유는 무엇입니까?


286

위험!

시스템이 충돌하거나 시스템을 강제 재부팅 할 준비가되어 있지 않으면이 명령을 실행하여 '테스트'하지 마십시오.

12.04를 실행하는 Virtualbox에서 앱을 컴파일하려고 시도했지만 대기하는 동안 댓글이 표시된 포럼에서 우연히 발생했습니다.

:(){ :|: & };:
재미도 시도 하고 루트가 필요하지 않습니다.

생각없이, 나는 그놈 터미널에서 그것을 실행했습니다. 12.04 (Virtualbox에서) 지연이 심하게 발생하여 종료해야했습니다.

내 질문은이 명령이 무엇을합니까?

: () {: | : &} ;:



1
또한 오래된 스레드를 참조하십시오 : ubuntuforums.org/showthread.php?t=1392511
Paddy Landau



9
"너무 나쁘다"는 상당히 낙관적입니다.
pstadler 2016 년

답변:


372

이것을 포크 폭탄 이라고합니다 .

:() 라는 함수를 정의한다는 의미입니다. :

{:|: &}함수를 실행 :하고 출력을 :함수로 다시 보내고 백그라운드에서 실행하는 것을 의미합니다.

;명령 분리기이다.

: 기능을 처음으로 실행합니다.

본질적으로 당신은 매번 두 번 자신을 호출하고 자신을 종료 할 방법이없는 함수를 만들고 있습니다. 시스템 리소스가 부족해질 때까지 계속 두 배가됩니다.

Virtualbox에서 실행하는 것은 실제로 합리적이었습니다. 그렇지 않으면 PC를 다시 시작해야했을 것입니다.


27
이 답변은 재부팅이 유일한 해결책 이라고 제안하는 것 같습니다 . 그러나 실제로이 포크 폭탄은 재부팅하지 않고 죽일 수 있으며 실제로는 일부 시스템에서 제대로 작동하지 않는 것으로 나타났습니다 (스폰 한계가 눈에 띄게 설정되어 있기 때문에).
Konrad Rudolph

27
사실, 전체 설명을 위해서는 ;명령 구분 기호를 언급해야합니다 . { ... }부분은 단순히 함수의 내용이다.
CVn

@ MichaelKjörling +1 귀하의 의견을 고려하기 전까지는 구문을 이해하지 못했습니다.
jumpnett

1
@SuperMatt 나는이 질문이 여전히 활성화되어 있는지 모르겠지만 어쨌든 나는 무엇을 |하고 무엇을하는지 알고 싶었습니다 &. 나는 당신이 기능의 작동을 제공 한 것을 알고 있지만이 두 가지가 무엇을하는지 알고 싶었습니다
Noober

1
@Noober 여전히 궁금한 점이 있다면 (리눅스의 간결하고 비밀스러운 문서의 블랙홀에서와 마찬가지로) 알고 있습니다! | 이 명령은 명령 뒤에 입력 된 명령 출력을 보내기 위해 명령 뒤에 배치되는 파이프입니다. &는 현재 스레드가 더 많은 명령을 계속 실행하도록 이전 명령에 대한 새 스레드를 작성하는 포크입니다.
flurbius

179

이것은 쉘에서 구현 된 소위 포크 폭탄 입니다.

위키 백과에서 :

:(){ :|:& };:
\_/| |||| ||\- ... the function ':', initiating a chain-reaction: each ':' will start    two more.
 | | |||| |\- Definition ends now, to be able to run ...
 | | |||| \- End of function-block
 | | |||\- disown the functions (make them a background process), so that the children    of a parent
 | | |||   will not be killed when the parent gets auto-killed
 | | ||\- ... another copy of the ':'-function, which has to be loaded into memory.
 | | ||   So, ':|:' simply loads two copies of the function, whenever ':' is called
 | | |\- ... and pipe its output to ...
 | | \- Load a copy of the function ':' into memory ...
 | \- Begin of function-definition
 \- Define the function ':' without any parameters '()' as follows:

3
접선 점이며 용어 '삭제'가 오버로드 될 수 있지만 기술적으로 백그라운드에 놓인 프로세스는 제거되지 않으며 항상 'fg'명령으로 포 그라운드로 가져올 수 있으며 프로세스는 다음과 같은 경우 종료됩니다. 사용자가 로그 아웃합니다 (로그 아웃을 수행하는 데 여전히 사용 가능한 자원이있는 경우 ) .... 프로세스 또는 jobid에서 '삭제'를 실행 하지 않는 한 . 그 후에는 실제로 사용되지 않습니다. 로그 아웃해도 종료되지 않으며 fg는 영향을 미치지 않습니다.
Rondo

1
사소한 점이지만 괄호는 bash와 같은 쉘에 매개 변수가 없다는 것을 의미하지는 않으며 C 스타일 언어에서 남은 장식 일뿐입니다.
찰리 하딩

75

이 명령은 잘 알려진 버전의 포크 폭탄입니다

위키 백과에서 포크 폭탄 그림

프로세스를 무한정 포크하여 컴퓨터 메모리가 부족합니다. 당신이 그것에 대해 사용할 수있는 몇 가지 안전 장치가 있습니다.

유닉스 유형 시스템은 일반적으로 ulimit 쉘 명령 또는 후속 작업 인 setrlimit에 의해 제어되는 프로세스 제한을 갖습니다. Linux 커널은 프로세스의 RLIMIT_NPROC rlimit ( "리소스 한계")를 설정하고 시행합니다. 프로세스가 포크를 수행하려고 시도하고 해당 프로세스를 소유 한 사용자가 이미 프로세스를 소유 RLIMIT_NPROC한 경우 포크가 실패합니다. 또한 Linux 또는 * BSD에서 pam_limits구성 파일 /etc/security/limits.conf을 동일한 효과로 편집 할 수 있습니다 . 그러나 모든 Linux 배포판 pam_limits에 기본적으로 모듈이 설치되어 있는 것은 아닙니다 .


18

에 따르면 :(){ :|: & };: 라고

포크 폭탄 은 일종의 시적 바이러스 제작자입니다

... 사악한 작은 프로그램이 여러 개의 사본을 만들어 연쇄 반응을 일으키고 시스템의 자원을 빨리 소모하도록 명령합니다 ...

따라서 이것을 실행하지 말 것을 권장합니다. 루프 방식으로 실행되어 랩톱에서 쉽게 가열 될 수 있으므로 하드웨어가 손상 될 수 있습니다.

다른 링크는 여기 에서 스크린 샷을 통해 설명합니다 .


59
포크 폭탄으로 인해 하드웨어가 손상 되면 훨씬 더 큰 문제가 발생합니다.
CVn

38
어쩌면 그는 PC 근처에서 폭발 할 수있는 포크 모양의 폭탄에 대해 이야기하고 있었습니까?
dysoco

2
스크린 샷 링크가 깨졌습니다.
IMustBeSomeone 21

0

위에서 설명한대로 " 포크 폭탄 " 이라고하며 이를 수행하는 또 다른 방법은 파이핑 대신 백그라운드 실행을 사용하는 것입니다.

:(){ :&:;};:
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.