ずっと前のUNIXの歴史では、サーバー上のユーザーは、/etc/shadow
にエントリを持つ実際のUNIXユーザーでした。 インタラクティブなログインシェルとホームディレクトリ。管理者がユーザーと通信し、サーバーリソースが不当に割り当てられる原因となる愚かな、または悪意のあるミスを回避するためにユーザーのアクティビティを監視するためのツールがありました。
最近では、ユーザーベースの/etc/shadow
にエントリが含まれる可能性は低くなっています。 代わりに、LDAP、Drupal、OpenShiftのいずれであっても、抽象化レイヤーによって管理されます。繰り返しになりますが、サーバーの数が増えました。つまり、メンテナンスを実行するためにログインおよびログアウトするシステム管理者の数が増えています。活動がある場所では、間違いや混乱が生じる可能性があるため、古い監視ツールを取り除き、それらを有効に活用するときが来ました。
サーバーで何が起こっているかを追跡するのに役立つ、忘れてしまった(または知らなかった)監視コマンドの一部を次に示します。
まず、基本です。
who
コマンドはGNUcoreutilsパッケージによって提供され、その主な仕事は/var/log/utmp
を解析することです。 調査結果をファイルして報告します。
utmp
ファイルは、システム上の現在のユーザーをログに記録します。すべてのプログラムがutmp
を開始するわけではないため、必ずしもすべてのプロセスが表示されるわけではありません。 ロギング。実際、システムにはutmp
さえない場合があります デフォルトではファイル。その場合、who
/var/log/wtmp
にフォールバックします 、すべてのログインとログアウトを記録します。
wtmp
ファイル形式はutmp
とまったく同じです ただし、nullのユーザー名はログアウトと~
を示します 文字は、システムのシャットダウンまたは再起動を示します。 wtmp
ファイルはlogin(1)
によって管理されています 、init(1)
、およびgetty(8)
の一部のバージョン ただし、これらのアプリケーションはいずれも作成しません ファイルなので、wtmp
を削除すると 、その後、記録管理が無効になります。それだけで知っておくとよいでしょう:if wtmp
が欠落している場合は、その理由を確認する必要があります!
who --heading
の出力 次のようになります:
NAME LINE TIME COMMENT
seth tty2 2020-01-26 18:19 (tty2)
larry pts/2 2020-01-28 13:02 (10.1.1.8)
curly pts/3 2020-01-28 14:42 (10.1.1.5)
これにより、ログインした各ユーザーのユーザー名、ログインが記録された時刻、およびIPアドレスが表示されます。
who
コマンドはまた、どのユーザーをあなたが発見するかを示す公式のPOSIX方法を謙虚に提供します。 としてログインしますが、utmp
の場合のみ 存在する:
$ who -m
curly pts/3 2020-01-28 14:44 (10.1.1.8)
また、現在のランレベルを表示するメカニズムも提供します:
$ who -r
run-level 5 2020-01-26 23:58
w
ユーザーに関するもう少し詳しくは、単純なw
コマンドは、ログインしているユーザーとそのユーザーが行っていることのリストを提供します。この情報は、who
の出力と同様の形式で表示されます。 ただし、ユーザーがアイドル状態になっている時間、ログインTTYに接続されているすべてのプロセスで使用されているCPU時間、および現在のプロセスだけで使用されているCPU時間。ユーザーの現在のプロセスが最後のフィールドに表示されます。
サンプル出力:
$ w
13:45:48 up 29 days, 19:24, 2 users, load average: 0.53, 0.52, 0.54
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
seth tty2 Sun18 43:22m 0.01s 0.01s /usr/libexec/gnome-session-binary
curly pts/2 13:02 35:12 0.03s 0.03s -bash
または、-i
を使用してユーザーのIPアドレスを表示することもできます または--ip-addr
オプション。
情報が必要なユーザーを指定することで、出力を単一のユーザー名に絞り込むことができます。
$ w seth
13:45:48 up 29 days, 19:27, 2 users, load average: 0.53, 0.52, 0.54
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
seth tty2 Sun18 43:25m 0.01s 0.01s /usr/libexec/gnome-session-binary
utmpdump
utmpdump
ユーティリティは、その名前が示すとおりに(ほぼ)正確に実行します。/var/log/utmp
の内容をダンプします。 画面にファイルします。実際には、どちらかをダンプします utmp
またはwtmp
どちらを指定するかに応じて、ファイル。もちろん、指定するファイルは/var/log
にある必要はありません。 またはutmp
という名前もあります またはwtmp
、そしてそれは正しいフォーマットである必要さえありません。 utmpdump
をフィードする場合 テキストファイルの場合、コンテンツを画面(または--output
を含むファイル)にダンプします。 オプション)予測可能で解析しやすい形式で。
通常、もちろん、who
を使用するだけです。 またはw
ログインレコードを解析しますが、utmpdump
多くの場合に役立ちます。
- ファイルが破損する可能性があります。
who
およびw
多くの場合、破損自体を検出できます。utmpdump
それ自体は構文解析を行わないため、これまで以上に寛容です。生データをレンダリングして処理します。 - 破損したファイルを修復したら、
utmpdump
変更をパッチで戻すことができます。 - データを自分で解析したい場合があります。
who
の何かを探しているのかもしれません およびw
探すようにプログラムされていないか、独自の相関関係を作成しようとしている可能性があります。
理由が何であれ、utmpdump
ログインレコードから生データを抽出するための便利なツールです。
破損したログインログを修復した場合は、utmpdump
を使用できます 変更をマスターログに書き戻すには:
$ sudo utmpdump -r < wtmp.fix > /var/log/wtmp
ps
システムに誰がログインしているかがわかれば、ps
を使用できます。 現在のプロセスのスナップショットを取得します。これは、現在のプロセスに関する実行中のレポートを表示するトップと混同しないでください。これはps
の瞬間に撮ったスナップショットです が発行され、画面に印刷されます。どちらにも長所と短所があるため、要件に基づいてどちらを使用するかを選択できます。静的な性質のため、ps
後で分析する場合や、管理しやすい要約として特に役立ちます。
ps
コマンドは古くてよく知られており、多くの管理者が最新の実装ではなく古いUNIXコマンドを学習しているようです。最新のps
(procps-ng
から パッケージ)は、多くの役立つニーモニックを提供します。これは、RHEL、CentOS、Fedora、およびその他の多くのディストリビューションに付属しているため、この記事で使用されています。
--user
を使用すると、1人のユーザーが実行しているすべてのプロセスを取得できます。 (または-u
)オプション、およびレポートを作成するユーザーのユーザー名。どのプロセスが子プロセスの親であるかという追加のコンテキストを出力に与えるには、--forest
を使用します。 「ツリー」ビューのオプション:
$ ps --forst --user larry
PID TTY TIME CMD
39707 ? 00:00:00 sshd
39713 pts/4 00:00:00 \_ bash
39684 ? 00:00:00 systemd
39691 ? 00:00:00 \_ (sd-pam)
システム上のすべてのプロセスについて:
$ ps --forest -e
[...]
29284 ? 00:00:48 \_ gnome-terminal-
29423 pts/0 00:00:00 | \_ bash
42767 pts/0 00:00:00 | | \_ ps
39631 pts/1 00:00:00 | \_ bash
39671 pts/1 00:00:00 | \_ ssh
32604 ? 00:00:00 \_ bwrap
32612 ? 00:00:00 | \_ bwrap
32613 ? 00:09:05 | \_ dring
32609 ? 00:00:00 \_ bwrap
32610 ? 00:00:15 \_ xdg-dbus-proxy
1870 ? 00:00:05 gnome-keyring-d
4809 ? 00:00:00 \_ ssh-agent
[...]
デフォルトの列は便利ですが、調査対象に合わせて変更することができます。 -o
オプションを使用すると、表示する列を完全に制御できます。可能な列の完全なリストについては、標準形式指定子を参照してください。 ps(1)のセクション マニュアルページ。
$ ps -eo pid,user,pcpu,args --sort user
42799 root 0.0 [kworker/u16:7-flush-253:1]
42829 root 0.0 [kworker/0:2-events]
42985 root 0.0 [kworker/3:0-events_freezable_power_]
1181 rtkit 0.0 /usr/libexec/rtkit-daemon
1849 seth 0.0 /usr/lib/systemd/systemd --user
1857 seth 0.0 (sd-pam)
1870 seth 0.0 /usr/bin/gnome-keyring-daemon --daemonize --login
1879 seth 0.0 /usr/libexec/gdm-wayland-session /usr/bin/gnome-session
ps
コマンドは非常に柔軟です。出力をネイティブに変更できるため、grep
に依存する必要はありません。 およびawk
気になるものを見つけるために。優れたps
を作成する コマンドを実行し、記憶に残るものにエイリアスして、頻繁に実行します。これは、サーバーで何が起こっているかを常に把握するための最も重要な方法の1つです。
pgrep
場合によっては、問題のあるプロセスについて何らかの考えがあり、ユーザーやシステムではなく、それを調査する必要がある場合があります。そのために、pgrep
があります psproc-ng
からのコマンド パッケージ。
最も基本的なpgrep
ps
の出力でgrepのように機能します :
$ pgrep bash
29423
39631
39713
PIDを一覧表示する代わりに、返されるPIDの数を取得できます。
$ pgrep --count bash
3
詳細については、ユーザー名(-u
)によるプロセスの検索に影響を与えることができます。 )、ターミナル(--terminal
)、および年齢(--newest
および--oldest
)、 もっと。特定のユーザーに属するプロセスを検索するには、例:
$ pgrep bash -u moe --list-name
39631 bash
--inverse
を使用して逆一致を取得することもできます オプション。
pgrep
に関連 pkill
です 指図。 kill
によく似ています pgrep
と同じオプションを使用することを除いてコマンド そのため、最も簡単な情報を使用して、面倒なプロセスにシグナルを送信できます。
たとえば、ユーザーlarry
によって開始されたプロセスを発見した場合 はリソースを独占しており、w
からわかります そのlarry
ターミナルpts/2
にあります 、その後、端末名だけでログインセッションとそのすべての子を強制終了できます:
$ sudo pkill -9 --terminal pts/2
または、ユーザー名だけを使用して、それに一致するすべてのプロセスを終了することもできます:
$ sudo pkill -u larry
慎重に使用して、pkill
問題が手に負えなくなったときの優れた「パニック」ボタンまたはスレッジハンマースタイルのソリューションです。
一連のコマンドが端末に存在するからといって、必ずしも他のソリューションよりも優れているとは限りません。要件を確認し、必要なものに最適なツールを選択してください。グラフィカルな監視およびレポートシステムがまさに必要なものである場合もあれば、簡単にスクリプト化および解析できる端末コマンドが正しい答えである場合もあります。賢明に選択し、ツールを学びましょう。そうすれば、ベアメタル内で何が起こっているのかについて暗闇に陥ることはありません。
[監視とセキュリティについて詳しく知りたいですか? ITセキュリティとコンプライアンスのチェックリストを確認してください。 ]