ps는 여러 조건(AND)과 일치하는 프로세스만 표시합니다.

ps는 여러 조건(AND)과 일치하는 프로세스만 표시합니다.

ps매뉴얼 페이지 에 따르면 :

아래 설명된 경우를 제외하고 프로세스 선택 옵션이 추가됩니다. 기본 선택을 취소하고 선택한 프로세스를 표시할 프로세스 집합에 추가합니다. 따라서 주어진 선택 기준을 충족하는 경우 프로세스가 표시됩니다.

이것은 일치가 "AND"가 아니라 "OR"임을 의미한다고 생각합니다.

저는 디렉토리(mkdir mutex)를 생성하고 해당 디렉토리의 파일에 PPID 및 PID 정보를 쓰는 자체 잠금 스크립트를 개발 중입니다. 스크립트의 기능 중 하나는 모든 잠금 파일을 반복하고 $PPID 및 $PID를 추출하여 오래된 잠금 파일을 정리하는 것입니다. 다음으로 PID가 $PID이고 PPID가 $PPID인 프로세스가 아직 실행 중인지 확인합니다.

그런데 ps점점 많아지네요모두PPID $PPID로 처리하면 PID $PID도 얻습니다.pid $PID 및 ppid $PPID가 있는 프로세스만 표시하고 싶습니다.

여기서는 이것이 직관적으로 유용하다는 것을 알고 있지만 grep이를 수행하는 "더 저렴한" 방법이 있습니까? 다른 프로세스 관련 유틸리티일까요?


procps-3.2.7-16.el5

답변1

방금 확인해보니 CentOS 6.6에는 pgrep이 옵션이 없는 것 같아서 -F해당 사항이 없습니다. 이 답변은 다른 상황에서 유용할 수 있으므로 여기에 남겨 두겠습니다.


pgrep아마도 당신이 원하는 것 :

-P, --parent ppid,...
      Only match processes whose parent process ID is listed.
-F, --pidfile file
      Read  PID's  from  file.  This option is perhaps more useful for
      pkill than pgrep.

파일의 PID와 일치하도록 PID를 필터링하는 pgrep것처럼 보입니다 .-F

$ pgrep libvirtd
1343
18471
$ pgrep -F /var/run/libvirtd.pid -P 1
1343
$ echo -n 18471 > other-libvirtd.pid
$ pgrep -F other-libvirtd.pid -P 1
$ pgrep -F other-libvirtd.pid
18471

답변2

하나의 옵션을 사용하고 psor를 사용하여 추가로 필터링하는 것이 합리적인 접근 방식입니다.grepawk

-o옵션을 전달 ps하고 필드를 필요한 항목으로 제한하십시오. 머리글 행을 숨기려면 각 필드 이름 뒤에 등호를 사용하십시오. 명령 이름이 필요하지 않은 경우 개행 문자를 포함할 수 있는 comm또는 를 포함하지 마세요 args. 보안에 민감한 컨텍스트에서는 개행 문자가 포함된 경우 스크립트가 합리적인 작업을 수행하는지 확인하세요. 예를 들어, PID만 필요하고 특정 그룹에 속하고 특정 TTY에서 실행되는 모든 프로세스를 원하는 경우 다음을 사용하여 PID를 수집할 수 있습니다.

pid_list=$(ps -t tty3 -o 'pid= gid=' | awk '$2 == 1234 || $2 == "somegroup"')

당신이 생각하는 한 이것은 너무 많은 것입니다. 주어진 PID를 가진 프로세스가 있으므로 조건은 -p $PID필요한 모든 필터링입니다. 해당 PID로 프로세스의 PPID를 검색하고 이를 예상 값과 비교합니다. ps해당 PID를 가진 프로세스가 없으면 아무것도 출력되지 않습니다.

read pid expected_ppid <"$pidfile"
actual_ppid=$(ps -o ppid= -p "$pid")
if [ "$actual_ppid" = "$expected_ppid" ]; then …

올바른 특성을 가진 프로세스를 찾으면 동일한 프로세스일 수도 있고, 예상했던 프로세스가 오래전에 종료되고 해당 PID가 재사용되었기 때문에 관련 없는 프로세스일 수도 있다는 점을 명심하세요.

답변3

이것은 쉘 솔루션이므로 다음을 제외할 필요가 없습니다.ps

if [[ `ps --pid $PID -oppid=` = $PPID ]]
then
   : still running
else
   : not running
fi

관련 정보