백그라운드에서 자신을 호출하고 종료되는 스크립트를 감지하고 중지하는 방법

백그라운드에서 자신을 호출하고 종료되는 스크립트를 감지하고 중지하는 방법

도구에 대한 래퍼 스크립트를 작성 중입니다. 래퍼 스크립트는 환경을 준비한 다음 백그라운드에서 도구를 호출하고 종료해야 합니다. 다음과 같습니다.

#!/bin/bash
export FOO=1
tool "$@" &

여기에는 멋진 것이 없습니다. 단, 실수로 도구(/usr/bin/tool)를 호출하지 않았지만 효과적으로 래퍼 스크립트 자체(~/bin/tool)를 호출했습니다. 내가 그것을 알기도 전에 래퍼 스크립트를 실행했지만 아무 일도 일어나지 않았습니다. 적어도 아무것도 보이지 않습니다.

왜 아무 일도 일어나지 않는지 알고 싶습니다. 스크립트를 다시 엽니다. 오류를 확인하십시오(/usr/bin/tool ​​​​호출되지 않음). 실제 도구를 실행하고 저장하도록 수정합니다. 갑자기 이런 도구가 나타났습니다. 잠시 생각한 후에 래퍼 스크립트가 백그라운드에서 계속해서 실행되고 있다는 것을 깨달았습니다. 실제 도구를 호출하도록 스크립트를 편집하면 다음 스크립트 호출에서 즉시 도구를 호출하고 체인이 중지됩니다.

분할되지 않으므로 분할폭탄이 아닙니다. 그러나 이것은 재귀적인 유령인 것 같습니다. 자동 재귀 래퍼를 다시 만들고 계측을 시도했습니다. 내 지식은 제한되어 있습니다. 나는 주인이 아니다. 나는 ps 및 pgrep과 같은 도구를 사용해 보았습니다. 나는 이 스크립트에 눈에 띄는 이름을 붙였습니다: pgrep. 그러나 pgrep은 대부분의 경우 아무것도 보지 못합니다. 루프에서 pgrep을 실행하면 때때로 런어웨이 스크립트가 포착됩니다. 10초에 한 번씩 정도? 저는 통계를 하지 않았습니다.

재귀적 고스트 스크립트는 무해합니다. 자원을 거의 먹지 않습니다. 아마도 유일하게 눈에 띄는 효과는 PID가 급격히 상승한다는 것입니다. 왜냐하면 모든 새로운 호출은 새로운 PID를 얻게 되기 때문입니다.

백그라운드에서 자신을 호출하고 종료되는 폭주 재귀 고스트 스크립트를 감지하고 중지하는 방법은 무엇입니까?

재현하는 방법은 다음과 같습니다.

  1. woop다음을 사용하여 호출되는 스크립트를 만듭니다 .

     #!/bin/sh
     ./woop &
    
  2. 두 개의 터미널을 열고 텍스트 편집기에서 스크립트를 엽니다.

  3. 터미널에서 실행하세요 ./woop. 눈에 보이는 어떤 일도 일어나지 않는다는 점에 유의하세요. 프롬프트가 즉시 반환됩니다.

  4. 두 번째 터미널에서 실행하세요 while true; do pgrep -fa woop; done. 약 10초마다 결과가 표시됩니다.

  5. 텍스트 편집기에서 줄을 다른 것으로 ./woop &변경 하고 저장합니다. 첫 번째 터미널( ) ./woops &의 오류에 주목하세요 ../woop: line 2: ./woops: No such file or directory

  6. 더 이상 결과를 찾을 수 없다는 알림이 두 번째 터미널에 표시됩니다.

답변1

사용forkstat사용 가능한 경우 프로세스가 실행 중인지 나타내는 좋은 표시입니다. 예를 들어:

forkstat -e fork

확실하다면 다음 중 하나 또는 모두를 수행하십시오.

  • chmod -x /path/to/file
  • mv ...
  • rm ...

선택적으로 이 -S플래그를 사용하십시오(간단한 통계는 다음과 같습니다).

$ forkstat -S
... loads of lines
^C
 Fork     Exec     Exit  ...   Total Process
11546    11532    11547  ...   34625 /bin/bash - ./woop
...

관련된:


관련 정보