내 쉘 스크립트의 pgrep: 스크립트 자체를 계산하지 않습니까?

내 쉘 스크립트의 pgrep: 스크립트 자체를 계산하지 않습니까?

pgrep이게 내 행동이야FreeBSD스크립트:

luis@Balanceador:~/Temporal$ cat test.sh
#!/usr/bin/env bash
pgrep -fl "test.sh"

luis@Balanceador:~/Temporal$ ./test.sh
luis@Balanceador:~/Temporal$

출력이 없습니다. 이것은: 스크립트 자체는감지되지 않음달리는 것처럼. 명령줄 동작과 같습니다 pgrep. 나는 괜찮습니다.

이것은리눅스(우분투) 사례:

luis@Terminus:~/Temporal$ cat test.sh
#!/usr/bin/env bash
pgrep -fl "test.sh"

luis@Terminus:~/Temporal$ ./test.sh
4514 bash
luis@Terminus:~/Temporal$

보시다시피 test.sh스크립트 자체는감지됨실행 중인 프로세스로.

쉘(Bash)을 개발 중입니다.스크립트그건 가능해야 해멈추다그리고 기다리면다른 예시(동일한 이름)이 감지되고 Linux 및 FreeBSD에서 작동해야 하므로 이를 위해 pgrep 명령을 균질화하고 싶습니다.

두 사람 모두를 잘 행동하게 만드는 방법이 있습니까?같은?

grep유사하거나 허용되는 파생 답변 ps.

테스트됨:

-x(정확한) 스위치는 다음에서 나옵니다.매뉴얼 페이지, 그러나 다음에는 적용되지 않습니다.매개변수스크립트에서 (또는 작동시키는 방법을 이해하지 못합니다). 이 경우 매개변수는 계측에 중요하지 않습니다(모든 매개변수가 될 수 있음). 기본 ".sh" 스크립트만 계측하면 됩니다.

추가 설명:

  • "파일 잠금 사용"과 같은 질문에 대답하지 마십시오. 사실 저는 이 pgrep도구 에 대해 알고 싶습니다 .

답변1

FreeBSD는 프로세스를 실행하는 스크립트 인스턴스를 포함하여 pgrep프로세스의 조상을 제외합니다 . pgrepLinux에는 pgrep해당 기능이 없습니다.

스크립트 인스턴스를 수동으로 제외할 수 있습니다. 제외할 프로세스 ID는 에 있습니다 $$. 약간 주의해서 하위 쉘을 사용하지 마세요. 가장 쉬운 방법 pgrep … | grep -v "^$$ "은 아마도 파이프의 오른쪽을 나열하는 것입니다( pgrep호출 전에 프로세스 목록에 도달한 경우). ) grep.

instances=$(pgrep -fl "test.sh")
if [[ "$instances" =~ (.*)$'\n'"$$ "[^$'\n']*$'\n'(.*) ]]; then
  instances=${BASH_REMATCH[1]}$'\n'${BASH_REMATCH[2]}
elif [[ "$instances" =~ (^|.*$'\n')"$$ "[^$'\n']*($|$'\n'.*) ]]; then
  instances=${BASH_REMATCH[1]}${BASH_REMATCH[2]}
fi

답변2

x플래그에 추가하면 됩니다 :

#!/usr/bin/env bash                                                                                                                                                                                                                            
pgrep -flx "pgrep.sh"

Ubuntu에서 테스트한 결과 출력에 아무것도 인쇄되지 않습니다(원하는 경우!).

관련 정보