Как я могу получить вывод 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 дней? Я пытаюсь определить, как долго выполняется процесс ...
Второй столбец - это идентификатор процесса? Так что если я сделаю kill 32017
это убьет 2-й процесс?
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
Спасибо geekosaur, я хотел бы использовать эту команду для ваших требований, а не отдельную команду:
ps -ef | head -1; ps -ef | grep "your-pattern-goes-here"
Сложность состоит в том, чтобы использовать ";" поддерживается оболочкой, чтобы связать команду.
Второй столбец - это идентификатор процесса; 4-й - когда процесс был создан (обычно это время запуска вашей программы, но не всегда; рассмотрите execve()
и друзья); 6-е - количество потребляемого процессорного времени. Таким образом, он работал 8 дней и использовал почти 7 дней процессорного времени, что я считаю тревожным.
Получить заголовок в том же вызове в лучшем случае непросто; Я бы просто сделал отдельный ps | head -1
. Вы можете подумать об использовании ps
собственные методы отбора или что-то в этом роде pgrep
вместо того grep
, который на самом деле не предназначен для передачи заголовков.
Решение egrep простое и полезное, но, конечно, вы зависите от заголовка, всегда содержащего «PID» (хотя более чем разумное предположение) и той же строки, не встречающейся в другом месте. Я предполагаю, что этого достаточно для ваших нужд, но если кому-то нужна альтернатива, есть sed.
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;'
более простая альтернатива: ps -ef | { head -1; grep GMC; }
замените число на количество строк, в которых отображается ваш заголовок.
вы можете получить pid с помощью pgrep
pgrep PNetTNetServer
а затем используйте ps с pid
ps u 12345
или даже объединить два в одну команду
ps u `pgrep PNetTNetServer`
Это покажет только ту строку, которую вы хотите, и включит заголовок.
Я написал небольшую программу на 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;
}