GNU/Linux >> Belajar Linux >  >> Ubuntu

Temukan Kemungkinan Proses Berdasarkan Snapshot Tepat Waktu?

Pengantar

Saya mencoba menangkap proses apa yang dimulai selama periode waktu terbatas.

Saya telah membuat skrip (ps-suspects.sh ) dimana:

  • Saya menjalankan ps-suspects.sh dari terminal.
  • Saya memulai dan menutup aplikasi, misalnya Kalkulator Desktop.
  • Saya tekan Ctrl +C untuk mengakhiri ps-suspects.sh
  • Saya ingin tahu apa nama proses untuk Kalkulator itu
  • Saya tidak ingin mencantumkan semua nama proses lain yang menjalankan seluruh periode snapshot.

Masalahnya

Saya memiliki potongan kode yang perlu disesuaikan:

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

Inilah yang dihasilkannya:

$ 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

Saya ingin menghilangkan semua baris yang muncul 63 atau lebih.

Keluaran yang Diinginkan

$ 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

Pertanyaan

Dalam contoh ini 63 akan muncul pada 90%-99% dari baris di kolom 1 dan garis tersebut perlu dihapus. Semua kemunculan 126 juga bisa dihilangkan. Jadi apa pun yang paling banyak terjadi dan lebih hebat dapat dihapus.

Dapatkah seseorang menemukan awk yang hilang? dan/atau uniq dan/atau grep untuk menyelesaikan tugas?

Jawaban yang Diterima:

Python untuk menyelamatkan:

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="")'

Alternatif, versi tidak terkompresi untuk digunakan sebagai file skrip:

#!/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="")

Satu-satunya asumsi yang dibuat skrip ini tentang inputnya, yang diharapkan disalurkan ke stdin, adalah bahwa setiap baris memiliki nomor integer yang valid di kolom pertama yang dipisahkan spasi. Garis tidak perlu diurutkan dalam bentuk apa pun.

Terkait:Algoritma hash apa yang digunakan untuk kata sandi yang disimpan dalam bayangan di 11.10?

Catatan: Jika ada beberapa nomor paling umum yang berbeda di kolom pertama dengan jumlah yang sama, yang mana dari keduanya yang dipilih adalah arbitrer, tetapi harus konstan untuk input yang sama. Jika ini tidak diinginkan, Anda harus mengganti baris yang menemukan nilai paling umum dengan sesuatu seperti ini, untuk menemukan nilai paling umum tertinggi:

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

Contoh masukan:

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

Contoh keluaran:

1 foo
2 baz
2 cherry

Ubuntu
  1. Cara Menemukan dan Mengurutkan File Berdasarkan Tanggal dan Waktu Modifikasi di Linux

  2. Temukan Waktu Eksekusi Perintah Atau Proses Di Linux

  3. Temukan Dan Urutkan File Berdasarkan Akses, Tanggal Dan Waktu Modifikasi Di Linux

  1. Linux – Bagaimana Menemukan Tanggal Pembuatan File?

  2. Bagaimana menemukan semua proses anak?

  3. Temukan (dan bunuh) proses lama

  1. Linux – Bagaimana Menemukan Proses Menggunakan Port Serial?

  2. Bagaimana Menemukan Waktu Jalankan Program Dari Baris Perintah?

  3. Temukan Proses Orphan Linux