ずっと前の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セキュリティとコンプライアンスのチェックリストを確認してください。 ]