프로세스 목록에서 grep 제외


27

실행중인 데몬의 프로세스 ID를 반환하는 명령을 함께 모았습니다.

ps aux | grep daemon_name | awk "{ print \$2 }"

완벽하게 작동하고 PID를 반환하지만 아마도 현재 실행중인 프로세스 인 두 번째 PID도 반환합니다. 반환 된 PID 목록에서 명령을 제외 할 수있는 방법이 있습니까?

몇 번 테스트 한 결과 내 명령이 항상 목록의 두 번째 PID 인 것처럼 보이지만 정확하지 않은 경우 첫 번째 PID 만 잡고 싶지 않습니다.


답변:


27

grep -v스위치는 대기열에서 제외하고 결과를 반대로 바꿉니다. 따라서 다음과 같이 만드십시오.

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

Upd . -Cswitch를 사용하여 다음과 같이 명령 이름을 지정할 수도 있습니다 .

ps -C daemon_name -o pid=

후자 -o는 목록에서 원하는 정보 열을 결정합니다. pid프로세스 ID 열만 나열합니다. 그리고 =뒤에 등호 pid는 해당 제목에 대한 열 제목이 없음 을 의미하므로 명확한 숫자-PID 만 얻습니다.

이것이 도움이되기를 바랍니다.


2
"grep -v grep"사용하기 : "grep"를 포함하여 긴 명령 줄을 가지고있을 수 있습니다. grep -v "grep daemon_name"
phil_w

좋은 지적, @phil_w, 감사합니다. 답변을 업데이트했습니다.
Serg ikS 2016

23

캐릭터 클래스 트릭을 사용할 수 있습니다. "[d]"는 "[d]"만 "d"와 일치하지 않습니다.

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

나는 이것을 사용하는 것을 선호한다 | grep -v grep.


그것은 영리한 속임수입니다. 나는 배우는 동안 현재 상황을 단순하게 유지하고 있으며 | grep -v grep코드를 다시 방문하면 이해하기가 더 쉬울 것입니다.
tak

나는 이것이 어떻게 작동하는지 이해하려고 노력하고있다. 무슨 뜻인지 설명해 주 "[d]" does not match "[d]" only "d"시겠습니까?
Nowaker

@Damian : 대괄호는 검색 표현식에서 메타 문자 (문자 세트로 구분)이므로 명령 자체 는 명령 자체 grepps출력 행 과 일치하지 않습니다 grep(원래 질문에서 "두 번째 PID"라고 함). expression a[xy]d은 텍스트와 일치 하지 않지만a[xy]d text axd또는 text 와 일치 합니다 ayd. 따라서 expression [f]oo은 text 와는 일치 foo하지만 text 와는 일치 하지 않습니다 [f]oo. 나는 그것이 분명하기를 바랍니다.
RedGrittyBrick

좋아, ARGV에 대해 틀렸다. 이것은 단지 정규 표현식입니다. 감사.
Nowaker

엄청나게 영리하다! 잠시 생각해 보았습니다. 감사합니다!
Subfuzion

15

ps보다 안정적인 대안이 있으면 출력을 구문 분석하지 마십시오 .

pgrep daemon_name
pidof daemon_name

예, 마침내 프로세스 관리가 의미가 있습니다.
Błażej Michalik

pgreppidof정확히 일치 하는 동안 하위 문자열로 검색 -내가 필요로하는 것! 감사!
Sasha

3

ps -C옵션은 모든 Unix 기반 시스템에서 보편적 인 것은 아니지만 시스템에서 작동하는 경우입니다. 대신 나는 grep을 완전히 피할 것입니다.

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

작은 따옴표로 이스케이프 할 필요가 없습니다. ps aux대부분의 유닉스 기반 시스템에서 전체 프로세스 목록을 제공하며 awk일반적으로 기본적으로 설치됩니다.


3

pgrep이름으로 프로세스의 pid를 찾는 데 사용하십시오 .

pgrep proc_name

결과에 추가 프로세스 이름이있는 경우 ( -l) :

pgrep -l proc_name

프로세스 이름 ( -l) 및 인수 ( -f) 를 찾아 표시하십시오 .

pgrep -lf proc_name_or_argument

좋은 점 pgrep은 절대로 일치하는 것으로보고하지 않는다는 것입니다. 그러나 pid를 가져 와서 pgrep해당 프로세스를 by에 의해 죽일 필요는 없습니다 kill. pkill대신 사용하십시오 :

pkill proc_name

(기본적으로) 대신 SIGKILL신호 ( -9또는 -KILL)를 지정하십시오 SIGTERM.

pkill -9 proc_name

프로세스 이름 ( -l)과 인수 ( -f)를 찾고 신호 ( 또는 )로 프로세스를 -I종료하기 전에 확인 ( )을 요청하십시오 .SIGKILL-9-KILL

pkill -KILL -Ilf proc_name_or_argument

-I옵션은 pkillOS X Mavericks와 같은 일부 버전에서만 사용할 수 있습니다 .


0

bash를 사용하는 경우 다음을 사용하여 다음을 수행 할 수도 있습니다. ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID

이것은 불필요하게 복잡합니다. 단순히 전화하지 마십시오ps -eaf | grep "process_name" | awk '{print $2}'
David Nedrow

0

이 줄은 "grep"을 제외한 pid (프로세스 ID)를 돌려줍니다.

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)

약간의 설명이 좋을 것입니다.
davidbaumann

이것은 기본적으로 허용되는 답변과 동일하지만 장식이 다릅니다.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.