않는 방법 "동안 (수면 100 &!) do; 완료"일 zsh을에, 어떻게 그것을 bash는 복제 될 수 있을까?


14
Wikipedia에 따르면, forkbomb :(){ :|:& };:이 zsh을 명령 while (sleep 100 &!) do; done으로 중지 할 수 있습니다

,하는 것입니다 가정 스폰 수면 (100 개) 처리 할 때까지 .? 모든 forkbomb 프로세스가 사라 졌어요이 마법처럼 보인다,. 그것이 내가 정확히 무슨 일이! "&"는 의미로 특히 궁금 작동합니까 방법

어떤 것 bash는 같은 동등한 명령보기

11

포크 - 폭탄이 작동하는 이유는 한 번에 실행될 수있는 프로세스 수에 제한이 있기 때문이며 포크 - 폭탄이이 한계를 채우기 위해 설계되었습니다.

자식 프로세스를 생성 할 수없는 경우 제공 한 forkbomb 코드 때문에 부모 프로세스가 실제로 중단되지 않지만 새 grand * -children을 계속 작성한다는 사실은 프로세스 테이블을 가득 채 웁니다.

수면 솔루션은 잠깐 동안 잠잘 수있는 프로세스에서 몰래 들어가도록 설계되어 있으며 관리되는 수면 프로세스마다 포크 폭탄이 덜 발생합니다. 결국 수면 프로세스가 proces 테이블을 채우고 포크 폭탄이 사라집니다.

일단 프로세스 테이블이 절전 모드로 풀리면 while 회 돌이가 종료 될 수 있고 절전 프로세스는 절전 시간이 끝나면 죽을 것입니다. 문제가 해결됨. 이미 zsh을 명령의 중요한 부분을 언급 한 바와 같이

&에서-배경 실행, 그래서 bash는 명령은 기본적으로 동일한 다른 답변에 주어진 것 :

while (sleep 100 &) do; done 

I 돈 잠자기 시간에 로그 아웃하지 않는 한 nohup/! 부분이 중요하다고 생각하지 않습니다.하지만 틀렸다고 생각하면 곧바로 설정해 드리겠습니다.


2

? 매우 흥미로운 질문입니다.

위키피디아의 기사에 따르면 완전한 명령의 목적은 포크 폭탄을 더 이상 사용할 수 없게하는 많은 무해한 일자리를 만드는 것입니다. 포크 폭탄을 더 이상 사용할 수 없게 될 것이기 때문입니다. 작업이 &|' or & 시작하면 zsh manual에 따르면

,

! ', 는 그 작업이 즉시 부인한다. 시작 후 작업 테이블에 자리가없고 작업 제어 기능이 적용되는 이 아닙니다.

나는 bash와 동일한 것을 달성하는 방법을 잘 모르겠습니다. 그러나 다음과 같은 것을 할 수 있습니다

nohup sleep 100 & 

8

첫째는 포크 폭탄을 쓸 수 있습니다 : 조금 더 명확하게

foo() 
{ 
    foo|foo& 
} 
foo 

- 각각의 반복은 두 개의 서브 프로세스를 시작하고 죽는다. 그래서 만약 포크가 실패한다면, 그것은 매달리지 않을 것입니다.

그러므로 우리가해야 할 일은 일시적으로 실패하는 것입니다. 따라서 수면 프로세스와 마찬가지로 100 % 수면을 취하고 프로세스 공간을 차지하는 프로세스를 생성합니다.

zsh &!&과 비슷하지만 로그 오프 할 때 죽이지는 않는 새 프로세스가 표시되지 않습니다.이 예제에서는 중요하지 않습니다. (manual) nohup으로 바꿀 수 있습니다.

따라서 배쉬 :

while (nohup sleep 100 &) do; done 

작동합니다.


6

나는 Wikipedia 기사의 일부를 쓴 사람이다. (우연히 내 시스템에서 포크 폭탄을 실수로 시작한 후이 치료법을 발견했다.)

"&!" "&"대신 zsh가 새 프로세스에 대한 작업 제어를 수행하지 못하도록합니다. 즉, 언제 그리고 완료했는지 관리하려고합니다. 나는 그것을 시도했을 때 직업 통제가 왜 문제인지 정확히 기억하지 못한다. 실제로 "치료"가 어떻게 작동하는지 그리고 작업 제어를 방해하지 않으면 어떻게되는지보십시오. 어쩌면 작업 제어 문제는 bash에 존재하지 않는 zsh의 버그와 관련이있을 수 있습니다. zsh에서도 더 이상 관련이 없습니다.

"&"을 bash로 시도해보십시오. 작업 제어가 방해를 받으면 비활성화 ("set + m") 해 주시면 잘 될 것입니다.

위키 백과 문서가 zsh에 종속되지 않아야한다는 것이 맞습니다.