Pgrep이 여러 PID를 반환합니다.

Pgrep이 여러 PID를 반환합니다.

내 스크립트는 프로세스 이름을 입력으로 받아들이고 종료합니다. pgrep을 사용해 보았으나 두 개의 PID가 반환되었습니다. 하나는 실행 중인 프로세스용이고 다른 하나는 프로세스 이름을 입력으로 받아들이는 스크립트용이므로 막혔습니다! 나는 또한 그 옵션을 사용해 보았지만 pgrep -fo그것도 도움이 되지 않았습니다. 어떤 조언이라도 도움이 될 것입니다. 이건 내 스크립트야

#!/bin/bash
ProcessName=$1

pID= pgrep -fl $ProcessName

echo $pID

따라서 스크립트를 호출하면 두 개의 PID가 반환됩니다.

bash-3.00$ ./dynamic_values.sh test-Process

10534 /xxx/xxo/xxx/xxe --run --propFile /application/test/test-Process_Archive.tra --innerProcess
23401 /bin/bash ./dynamic_values.sh test-Process

나는 단지 10534를 예상했지만 스크립트도 가져옵니다. OS 버전의 경우:

bash-3.00$ uname -a
Linux xxxxxx 2.6.9-67.0.1.

답변1

몇 주 전에도 같은 문제를 해결해야 했습니다. pgrep또한 pkill확장 정규식을 지원하므로 올바른 정규식을 얻는 것이 간단합니다.

다음은 내가 사용한 스크립트와 정규식입니다.

#!/bin/bash
ProcessName=$1

pID= pgrep -fl "^(/.*)?${ProcessName}\s"

echo $pID

(Caleb이 제안한 것처럼) 사용하는 것이 더 낫습니다 pkill.

pkill -fl "^(/.*)?${ProcessName}\s"

사용 사례와 프로그램 성능에 필요한 결과를 얻으려면 정규식을 조정해야 할 수도 있습니다.

이제 만약 있다면실제로 해당 이름으로 실행 중인 여러 프로세스는 물론 종료됩니다. 이것을 피하고 싶다면 -o그냥 kill을 사용하면 됩니다.가장 오래된프로세스를 일치시키거나 -n그냥 종료하세요.최신 정보. 하나만 원하지만 가장 오래된 것도 최신 것도 아닌 경우에는 를 사용하면 안 됩니다 p(kill|grep).

답변2

사용하지 않습니다

| grep -v $$

목록에서 프로세스를 제외하면 도움이 됩니까?

답변3

#!/bin/bash

ProcessName=$1

pID=`pgrep -fl $ProcessName`

echo "$pID" | grep -v  "^$$"

답변4

#!/bin/bash를 제외하면 해당 스크립트에 대한 다른 프로세스가 생성되지 않지만 실행되는 셸을 선택할 수는 없습니다. bash는 미소 짓는 사람들이 실행할 수 있을 정도로 기본 설정입니다.

그러나 이것이 두 번째 프로세스 ID를 제거할지 확실하지 않습니다.

이것이 완전하지 않다는 것을 알고 있지만 시간이 늦었고 아침에 일해야 하지만 이 "해야" 빠른 수정이 가능합니다.

관련 정보