ps의 출력을 구문 분석하는 단일 명령을 사용하여 실행중인 프로세스의 pid를 얻는 방법은 무엇입니까?


22

실행중인 프로세스의 pid를 반환하는 한 줄을 찾고 있습니다.

현재 나는 :

ps -A -o pid,cmd|grep xxx|head -n 1

그리고 이것은 주먹을 돌려줍니다 pid, command. 출력의 첫 번째 숫자 만 필요하고 나머지는 무시하십시오. 나는 여기에서 생각 sed하거나 awk도울 것이지만 그들에 대한 나의 경험은 제한적입니다.

또한 이것은 또 다른 문제가 있으며 xxx가 실행 중이 아닌 경우 grep의 pid를 반환합니다.

프로세스를 죽이는 것과 같은 다른 작업을 수행하기 위해 출력을 재사용하고 싶기 때문에 단일 행을 갖는 것이 정말 중요합니다.


1
헤드를 통해 파이프하고 -n 1로 리턴 할 라인을 지정 하시겠습니까?
Mike McMahon

답변:


28

프로세스의 pid를 pgrep원한다면 가능한 경우 사용할 수 있습니다. pgrep <command>명령의 pid를 리턴합니다 (또는 하나 이상의 명령 인스턴스가 실행중인 경우 pid 목록을 사용하면이 명령을 사용 head하거나 다른 적절한 명령 을 사용할 수 있습니다 )
.


+1 나의 평소 pgrep 사용 :kill `pgrep xxx`
Steve

20
@ steve : 아마도 당신은 봐야 pkill합니다.
추후 공지가있을 때까지 일시 중지되었습니다.

7

명령이 하나 더 필요했습니다. 공백으로 구분 된 값의 행에서 첫 번째 필드 만 원합니다.

ps -A -o pid,cmd|grep xxx | grep -v grep |head -n 1 | awk '{print $1}'

둘. 출력에서 grep 자체를 제거하기 위해 다른 grep을 추가했습니다.


6

pgrep을 사용하면 훨씬 더 간단합니다.

pgrep -o -x xxxx

위는 정확한 이름으로 가장 오래된 프로세스를 선택합니다.


OP는 프로세스를 죽이기 위해 명령을 사용하기를 원하기 때문에 pkill(같은 인수로) 가장 직접적인 선택입니다.
bstpierre


0

Cygwin에서 실행하여 -A 및 -o를 사용할 수는 없지만 다음과 같습니다.

$ ps
      PID    PPID    PGID     WINPID   TTY     UID    STIME COMMAND
     4580       1    4580       4580  ?       55573   May 21 /usr/bin/mintty
     5808    7072    5808       7644  pty3    55573 13:35:31 /usr/bin/ps
     7072    5832    7072       6424  pty3    55573   May 21 /usr/bin/bash


$ ps | grep '/usr/bin/mintty' | head -n 1 | awk '{print $1}'
4580

0

당신은 같은 것을 할 수 있습니다

ps -A -o cmd,pid | egrep "^xxx " | head -n 1 | sed -r -e 's/.* ([0-9]+)$/\1/'

그런 다음 xxx는 프로세스 이름이어야하며 앵커 때문에 grep을 선택하지 않습니다 ^

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.