Як підключити вихід 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.