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
프로세스의 조상을 제외합니다 . pgrep
Linux에는 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에서 테스트한 결과 출력에 아무것도 인쇄되지 않습니다(원하는 경우!).