GNU/Linux >> Linux の 問題 >  >> Ubuntu

時間内のスナップショットに基づいて可能性の高いプロセスを見つけますか?

はじめに

限られた期間にどのプロセスが開始されたかを把握しようとしています。

スクリプトを作成しました(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 列1の行の90%〜99%に表示され、それらの行を削除する必要があります。 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にパイプされることが期待されており、各行の最初の空白で区切られた列に有効な整数があるということです。行をどのような形式でも並べ替える必要はありません。

関連:11.10でシャドウに保存されたパスワードに使用されるハッシュアルゴリズムは何ですか?

注: 同じカウントの最初の列に複数の異なる最も一般的な番号がある場合、これら2つのうちどちらが選択されるかは任意ですが、同じ入力に対して一定である必要があります。これが望ましくない場合は、最も一般的な値を見つける行を代わりに次のようなものに置き換えて、最も一般的な値を見つける必要があります。

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

Ubuntu
  1. Linuxでのアクセス、変更日時に基づいてファイルを検索して並べ替える

  2. Linux –ファイルの作成日を見つける方法は?

  3. コマンドラインからプログラムの実行時間を見つける方法は?

  1. Linuxで変更日時に基づいてファイルを検索およびソートする方法

  2. Linux の孤立したプロセスを見つける

  3. すべての子プロセスを見つける方法は?

  1. Linuxでのコマンドまたはプロセスの実行時間を検索する

  2. Linux –シリアルポートを使用してプロセスを見つける方法は?

  3. Linux:ゾンビ プロセスを見つけて強制終了する