Як підключити вихід PS заголовками


26

Як я можу підключити вихід PS із заголовками на місці?

Ці два процеси складають додаток, що працює на моєму сервері ....

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 днів? Я намагаюся визначити тривалість того, як триває процес ...

Чи ідентифікатор 2-го стовпця процес? Так що, якщо я kill 32017це зробити, це вб'є другий процес?

Відповіді:


37
ps -ef | egrep "GMC|PID"

Замініть "GMC" та psкомутатори за потребою.

Приклад виводу:

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
Було б добре додати інформацію про те, чому це працює.
Ілля Лінн

2
Ні, це вправа для користувача.
Хіпі

@ElijahLynn Він відповідає тексту в заголовку - в цьому випадку PID. Але ви можете поміняти його на UID, PTIME або що-небудь інше в шапці ...
Бен Крізі

5
Таким чином, ps -eвибираються всі процеси та ps -fє повноформатний перелік, який показує заголовки стовпців. Потім ми передаємо заголовки стовпців і виводимо в egrep, що є розширеним grep і дозволяє трубі |мати особливе значення, яке АБО (це АБО це). Таким чином, ви узгоджуєте PID у заголовках стовпців плюс вихідні рядки, які мають значення.
Ілля Лінн

Мені довелося використовувати прості лапки в команді egrep / grep -E в Ubuntu 16.04, наприклад: 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 ніколи не використовував цю здатність оболонки. Я спробував вашу вдосконалену команду, працює чудово! Дізнався, :)
Вік Лау

3
Знайдене пояснення щодо цієї техніки, яка називається "Команди групування", для цікавості інших див.: Gnu.org/software/bash/manual/html_node/Command-Grouping.html
Вік Лау

@ 7yl4r чудова техніка! Я дивився, як не повторити команду. Згрупованих команда може бути навіть водопровідна: ps -ef | { head -1; grep "pattern" | head -5; }. Корисно, якщо візерунок grep-ed має багато результатів!
залежний

6

Другий стовпець - ідентифікатор процесу; Четверте - це коли процес був створений (зазвичай це час запуску вашої програми, але не завжди; врахуйте execve()і друзів); 6-е - кількість споживаного часу процесора. Тож він працює 8 днів і використовував майже 7 днів процесорного часу, що я вважаю б занепокоєнням.

Отримати заголовок в одній виклику в кращому випадку складно; Я б просто зробив окрему ps | head -1. Ви можете розглянути можливість використання psвласних методів вибору чи чогось подібного pgrepзамість цього grep, що насправді не призначене для передачі заголовків.


Що таке 83?
Вебнет

Поточний пріоритет процесу, який ґрунтується на його минулому використанні процесора та вводу / виводу та назначеному користувачем або системою niceзначенні. Менші цифри мають вищий пріоритет. У цьому випадку grepпріоритет 0, оскільки він був заблокований на читанні диска та дав можливість записати свій вихід, і PNetTNetServer.binце велика кількість, оскільки він постійно використовує часовий відрізок, не блокуючи його. (Планування складно, і деталі залежатимуть від точного планувальника, що використовується.)
geekosaur

5

Рішення egrep просте і корисне, але, звичайно, ви залежите від заголовка, який завжди містить "PID" (хоча більш ніж розумне припущення) і ту саму рядок, що не виникає в іншому місці. Я здогадуюсь цього достатньо для ваших потреб, але на випадок, коли хтось хоче альтернативу, є сед.

Sed дозволяє просто сказати "надрукувати перший рядок, а потім будь-який рядок, що містить візерунок". Наприклад:

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

Додайте /sed -n/d;до фільтру саму подачу:

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

ви можете отримати pid з pgrep

pgrep PNetTNetServer

а потім використовуйте ps з pid

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.