Я пытаюсь получить что процесс (процессы), запущенный за ограниченный по времени период.
Я создал сценарий (ps-suspects.sh
) где:
ps-suspects.sh
от терминала.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
закончить задачу?
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
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