헤더로 PS 출력을 grep하는 방법


26

헤더를 사용하여 PS 출력을 어떻게 grep 할 수 있습니까?

이 두 프로세스는 내 서버에서 실행되는 앱을 구성합니다 ....

root     17123 16727  0 16:25 pts/6    00:00:00 grep GMC
root     32017     1 83 May03 ?        6-22:01:17 /scripts/GMC/PNetT-5.1-SP1/PNetTNetServer.bin -tempdir /usr/local/GMC/PNetT-5.1-SP1/tmpData -D

않는 6-22:01:17그 6 일 동안 운영하고 있다는 말인가요? 프로세스가 얼마나 오래 실행되었는지 길이를 결정하려고합니다.

두 번째 열은 프로세스 ID입니까? 그렇다면 내가 kill 32017두 번째 프로세스를 죽일까요?

답변:


37
ps -ef | egrep "GMC|PID"

ps필요에 따라 "GMC"와 스위치를 교체하십시오 .

출력 예 :

root@xxxxx:~$ ps -ef | egrep "disk|PID"

UID        PID  PPID  C STIME TTY          TIME CMD
paremh1  12501 12466  0 18:31 pts/1    00:00:00 egrep disk|PID
root     14936     1  0 Apr26 ?        00:02:11 /usr/lib/udisks/udisks-daemon
root     14937 14936  0 Apr26 ?        00:00:03 udisks-daemon: not polling any devices

8
이것이 왜 작동하는지에 대한 정보를 추가하는 것이 좋을 것입니다.
Elijah Lynn

2
아니요, 그것은 사용자를위한 운동입니다.
Hyppy 2019 년

@ElijahLynn 헤더의 텍스트 (이 경우 PID)와 일치합니다. 그러나 UID, PTIME 또는 헤더의 다른 항목으로 교체 할 수 있습니다.
Ben Creasy

5
따라서 ps -e모든 프로세스를 선택 ps -f하고 열 머리글을 표시하는 전체 형식 목록입니다. 그런 다음 열 머리글과 파이프를 출력하여 egrep으로 확장합니다. grep이 확장되어 파이프 |에 특별한 의미를 부여 할 수 있습니다. 즉 OR (이 OR)입니다. 따라서 열 머리글의 PID와 중요한 출력 라인을 일치시킵니다.
Elijah Lynn

Ubuntu 16.04의 egrep / grep -E 명령에 간단한 인용 부호를 사용해야했습니다. 예 : ps -ef | grep -E 'GMC|PID'
Vlax

13

geekosaur 덕분에 별도의 명령 대신 요구 사항에이 명령을 사용하고 싶습니다.

ps -ef | head -1; ps -ef | grep "your-pattern-goes-here"

까다로운 것은 ";"를 사용하는 것입니다. 셸에서 지원하여 명령을 연결합니다.


이것은 허용 된 답변보다 깨끗하고 강력합니다. 헤더에 PID가 있다고 주장하지 않으며 grep 문자열에 복잡성을 추가하지 않습니다.
7yl4r

2
아 잠깐만 요 .. ps -ef반복됩니다. 더 나은입니다ps -ef | { head -1 ; grep "your-pattern" ; }
7yl4r

@ 7yl4r은 그 쉘 능력을 사용하지 않았습니다. 개선 된 명령을 시도했지만 완벽하게 작동합니다! 배웠어요 :)
Vic Lau

3
다른 사람들의 호기심을 위해 '그룹화 명령'이라고하는이 기술에 대한 설명은 gnu.org/software/bash/manual/html_node/Command-Grouping.html
Vic Lau

@ 7yl4r 훌륭한 기술! 명령을 반복하지 않는 방법을 찾고있었습니다. 그룹화 된 명령을 파이프 할 수도 있습니다 ps -ef | { head -1; grep "pattern" | head -5; }. 패턴이 잘린 결과가 많은 경우에 유용합니다!

6

두 번째 열은 프로세스 ID입니다. 네 번째는 프로세스가 만들어 졌을 때입니다 (이것은 일반적으로 프로그램이 시작된 시간이지만 항상 그런 것은 아닙니다. execve()친구를 고려하십시오 ). 여섯 번째는 소비 된 CPU 시간입니다. 따라서 8 일 동안 실행되어 거의 7 일의 CPU 시간을 사용했기 때문에 걱정할 것입니다.

같은 호출에서 헤더를 얻는 것은 기묘한 일입니다. 나는 단지 별도의 일을 할 것이다 ps | head -1. 당신은 고려할 수 있습니다 ps자신의 선택 방법 또는 같은 무언가가 ' pgrep대신에 grep정말 통해 헤더를 통과하도록 설계되지 않은를.


무엇입니까 83?
웹넷

과거 CPU 및 I / O 사용량과 사용자 또는 시스템 할당 nice값을 기반으로하는 현재 프로세스 우선 순위 . 숫자가 작을수록 우선 순위가 높습니다. 이 경우 grep디스크 읽기에서 차단되어 출력을 기록하기 때문에 우선 순위 0 PNetTNetServer.bin이되며 , 차단하지 않고 시간 조각을 지속적으로 사용하기 때문에 많은 수입니다. (스케줄링은 복잡하며 자세한 내용은 사용중인 정확한 스케줄러에 따라 다릅니다.)
geekosaur

5

egrep 솔루션은 간단하고 유용하지만 물론 항상 'PID'(합리적인 가정보다)가 포함 된 헤더와 다른 곳에서 발생하지 않는 동일한 문자열에 의존합니다. 나는 이것이 당신의 필요에 충분하다고 생각하지만 누군가가 대안을 원한다면 sed가 있습니다.

Sed에서는 "첫 번째 줄을 인쇄 한 다음 패턴을 포함하는 모든 줄을 인쇄합니다"라고 말합니다. 예를 들면 다음과 같습니다.

ps auxwww | sed -n '1p; /PROCESS_NAME_TO_SEARCH/p;'

/sed -n/d;sed 자체를 필터링하려면 다음 을 추가하십시오 .

ps auxwww | sed -n '1p; /sed -n/d; /PROCESS_NAME_TO_SEARCH/p;'

/sed -n/d옳지 않다. 일부 기존 명령 sed -n에 인쇄하려고 할 수도 있습니다. 트릭은 사용하는 것 sed -n '1p; /[P]ROCESS_NAME_TO_SEARCH/p'입니다. ;-) []검색 문자열의 모든 문자 주위를 기록하십시오.
anishsane

4

더 쉬운 대안 : ps -ef | { head -1; grep GMC; }

숫자를 머리글이 표시된 줄 수로 바꿉니다.


1
이 접근 방식이 마음에 들지만 명령 끝에 다른 세미콜론이 필요합니다. ps -ef | { head -1; grep GMC; }. 또한 나는 다음과 같은 기능을 좋아한다 :function pgrep() { ps -ef | { head -1; grep $@; } }
Brett

1

pgrep으로 pid를 얻을 수 있습니다

pgrep PNetTNetServer

그런 다음 pid와 함께 ps를 사용하십시오.

ps u 12345

또는 둘을 하나의 명령으로 결합

ps u `pgrep PNetTNetServer`

원하는 줄만 표시하고 헤더를 포함시킵니다.


0

인쇄 할 작은 Perl 프로그램을 작성했습니다

  • 일치하는 첫 번째 줄과 일치하는 모든 줄
  • 일치하는 것이 없으면 아무것도 아닙니다.

나는 종종 그것을처럼 사용 ps | 1andre GMC하지만 파일 인수를 취할 수도 있습니다 (각 파일은 해당 파일의 행과 일치하는 자체 헤더 행을 제공합니다).



#!/usr/bin/perl

#
# 1andre <regexp> [<file> ...]
#
#   1 -           first ({1}st)
# and -                  {and}
#  re - (lines matching) {re}gexp
#
# If no <files> are given (or "-" is given as a <file>) stdin is
# used.
#
# If any lines from each <file> match the <regexp>, print the
# first line from that <file> and all the matching lines from
# that <file>.
#

use strict;
use warnings;

if(scalar @ARGV < 1) {
  printf STDERR "usage: %s <regexp> [<file> ...]\n", $0;
  exit 1;
}

my $re = shift;
my $header;

while(<>) {
  if($. == 1) {
    $header = $_;
  } elsif(m/$re/) {
    if(defined $header) {
      print $header;
      undef $header;
    }
    print;
  }
} continue {
  # close resets $. when we get to the end of each file that <> is processing
  close ARGV if eof;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.