Найдите, вероятно, процессы на основе снимка вовремя

Введение

Я пытаюсь получить что процесс (процессы), запущенный за ограниченный по времени период.

Я создал сценарий (ps-suspects.sh) где:

  • Я работаю ps-suspects.sh от терминала.
  • Я запускаю и закрываю приложение, скажем, Настольный калькулятор.
  • Я нажимаю Ctrl+C для окончания ps-suspects.sh
  • Я хочу знать, каково название процесса Калькулятора
  • Я не хочу список всех других имен процесса, выполняющих целый период снимка.

Проблема

У меня есть отрывок кода, для которого нужна подстройка:

$ sort -k15 ~/pid.log | uniq -f14 -c

Вот то, что это производит:

$ head ~/pid.tmp
  1 /mnt/e/bin/ps-suspects.sh Possible suspects causing problems
 63 1 S root       127     2  0  60 -20 -     0 -      Sep08 ?        00:00:00 [acpi_thermal_pm]
 63 1 S root        75     2  0  60 -20 -     0 -      Sep08 ?        00:00:00 [ata_sff]
 63 1 S root       447     2  0  60 -20 -     0 -      Sep08 ?        00:00:00 [ath10k_aux_wq]
 63 1 S root       446     2  0  60 -20 -     0 -      Sep08 ?        00:00:00 [ath10k_wq]
 63 1 S avahi      922   910  0  80   0 - 11195 -      Sep08 ?        00:00:00 avahi-daemon: chroot helper
 63 4 S avahi      910     1  0  80   0 - 11228 -      Sep08 ?        00:00:00 avahi-daemon: running [alien.local]
126 0 S rick      2902  2867  0  80   0 -  7409 wait_w Sep08 pts/18   00:00:00 bash
 63 0 S rick     25894  5775  0  80   0 -  4908 wait   10:43 pts/2    00:00:00 /bin/bash /mnt/e/bin/ps-suspects.sh
 63 0 S root       980   976  0  80   0 -  4921 -      Sep08 ?        00:00:01 /bin/bash /usr/local/bin/display-auto-brightness

Я хочу устранить все строки, которые происходят 63 или больше раз.

Желаемый вывод

$ ps-suspects.sh
20 times / second ps -elf is captured to /home/rick/pid.log

Type Ctrl+C when done capturing

~/pid.log is sorted and uniq counted on column 15
which is full path and program name.

Then all matches with same unique count (the headings)
are stripped and only new processes started are printed.

This function can help you trace down what processes are
causing you grief for lid close events, hot plugging, etc.
^C 
wc of ~/pid.log :   17288  343162 2717102 /home/rick/pid.log

HighCnt: 63
      1 /mnt/e/bin/ps-suspects.sh Possible suspects causing problems
     26 0 R rick     25976  2051  0  80   0 - 120676 -     10:43 ?        00:00:00 gnome-calculator
     62 0 S root     22561   980  0  80   0 -  3589 -      10:42 ?        00:00:00 sleep 60

Вопрос

В этом примере 63 появится на 90%-99% строк в столбце 1, и те строки должны быть удалены. Все случаи 126мог также быть удален. Так что-либо большая часть появления и больше может быть удалена.

Может кто-то придумывать пропавших без вести awk и/или uniq и/или grep закончить задачу?

4
задан 24 April 2019 в 20:21

2 ответа

Python к спасению:

python3 -c 'import sys,collections;l=[(int(L.split(None,1)[0]),L)for L in sys.stdin.readlines()];m=collections.Counter(x[0]for x in l).most_common(1)[0][0];print(*[x[1]for x in l if x[0]<m],sep="",end="")'

Альтернативная, несжатая версия для использования в качестве файла сценария:

#!/usr/bin/env python3
import sys
import collections

# read lines from stdin (with trailing \n) and extract the number in their first column
items = [(int(line.split(None, 1)[0]), line) for line in sys.stdin]
# find the most common number from the first column
most_common = collections.Counter(item[0] for item in items).most_common()[0][0]
# print input lines in order, but only those with their number lower than the most common
print(*[item[1] for item in items if item[0] < most_common], sep="", end="")

Единственное предположение, которое этот сценарий делает о его входе, который, как ожидают, будет передан по каналу в stdin, то, что каждая строка имеет допустимое целое число в своем первом разделенном от пробела столбце. Строки не требуются, чтобы быть отсортированными в любой форме.


Примечание: Если существует несколько различных наиболее распространенных чисел в первом столбце с тем же количеством, которое из тех двух выбрано, произвольное, но должен быть постоянным для того же входа. В случае, если это нежелательно, необходимо было бы заменить строку, находящую наиболее распространенное значение с чем-то вроде этого вместо этого, найти самое высокое наиболее распространенное значение:

most_common = sorted(collections.Counter(item[0] for item in items).most_common(),
                     key=lambda x:x[::-1])[-1][0]

Пример ввел:

1 foo
3 bar
2 baz
3 apple
3 banana
2 cherry
4 beep

Пример произвел:

1 foo
2 baz
2 cherry
6
ответ дан 1 December 2019 в 09:02

awk к спасению

После sort и uniq сделали их задание, я использовал awk закончить проект. Принятый ответ байта остается, когда он был первым для ответа и обеспечил превосходное понимание использования Python. В конце, хотя я создавал помехи вместе 3 или 4 различным Вопросам о Exchange Стека и Ответам, чтобы найти рабочее решение.

Вот полный сценарий для тех, кому интересно:

#!/bin/bash

echo 20 times / second ps -elf is captured to ~/pid.log
echo
echo "Type Ctrl+C when done capturing"
echo
echo "~/pid.log is sorted and uniq counted on column 15"
echo "which is full path and program name."
echo
echo "Then all matches with same unique count (the headings)"
echo "are stripped and only new processes started are printed."
echo
echo "This function can help you trace down what processes are"
echo "causing you grief for lid close events, hot plugging, etc."

trap ctrl_c INT

function ctrl_c() {
    echo " "
    printf "wc of ~/pid.log : " 
    wc ~/pid.log
    echo
    # Tally occurances of same Command Name always running
    sort -k15 ~/pid.log | uniq -f14 -c > ~/pid.tmp
    # What is the most frequent occurance?
    <~/pid.tmp awk '{print $1}' | sort -n | uniq -c > ~/pid.wrk
    HighCnt=$(awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} '\
        ~/pid.wrk)
    echo HighCnt: $HighCnt
    # Exclude all processes => highest count
    awk '($1 < var) ' var="$HighCnt" ~/pid.tmp
    rm ~/pid.wrk ~/pid.tmp ~/pid.log

    exit 0
}

echo "$0 Possible suspects causing problems" > ~/pid.log

while true ; do

    ps -elf >> ~/pid.log
    sleep .05 # 20 samples / second

done

Недостающие части

Это - код, который я добавил, чтобы заставить его работать.

# What is the most frequent occurance?
<~/pid.tmp awk '{print $1}' | sort -n | uniq -c > ~/pid.wrk
HighCnt=$(awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} '\
    ~/pid.wrk)
echo HighCnt: $HighCnt
# Exclude all processes => highest count
awk '($1 < var) ' var="$HighCnt" ~/pid.tmp

Демонстрационный вывод

gnome-calculator PID обнаруживается, как желаемый. Существует дополнительная строка sleep 60 который не требуется, но происходит, потому что демон проснулся и спал снова в течение тестового периода.

$ ps-suspects.sh
10 times / second ps -elf is captured to /home/rick/pid.log

Type Ctrl+C when done capturing

~/pid.log is sorted and uniq counted on column 15
which is full path and program name.

Then all matches with same unique count (the headings)
are stripped and only new processes started are printed.

This function can help you trace down what processes are
causing you grief for lid close events, hot plugging, etc.
^C 
wc of ~/pid.log :   17288  343162 2717102 /home/rick/pid.log

HighCnt: 63
      1 /mnt/e/bin/ps-suspects.sh Possible suspects causing problems
     26 0 R rick     25976  2051  0  80   0 - 120676 -     10:43 ?        00:00:00 gnome-calculator
     62 0 S root     22561   980  0  80   0 -  3589 -      10:42 ?        00:00:00 sleep 60
3
ответ дан 1 December 2019 в 09:02

Другие вопросы по тегам:

Похожие вопросы: