4.3 レッスン 2
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
4 Linuxオペレーティングシステム |
Objective: |
4.3 データの格納先 |
Lesson: |
2 of 2 |
はじめに
このレッスンでは、まずプログラムと設定ファイルについて調べた後に、コマンドがプロセスとして実行される方法を学びます。また、システムからのメッセージとして、カーネルリングバッファや、systemd
とそのジャーナルデーモン journald
がシステムログのこれまでの方法をどのように変えたかを説明します。
プロセス
ユーザーがコマンドを発行する度に、プログラムが実行されて1つ以上のプロセスが生成されます。
プロセスは階層構造を作ります。ブート時にカーネルがメモリにロードされた後に、最初のプロセスが起動して、それが他プロセスを起動し、さらにそれらが他のプロセスを起動していきます。それぞれのプロセスは、一意の識別子( PID
)と親プロセスの識別子( PPID
)を持っています。これらは正の整数で、順に割り当てられていきます。
プロセスを動的に調べる top
実行中のプロセスの状態は、top
コマンドで見ることができます。
$ top top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14 Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie %Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 436 carol 20 0 42696 3624 3060 R 0,7 0,4 0:00.30 top 4 root 20 0 0 0 0 S 0,3 0,0 0:00.12 kworker/0:0 399 root 20 0 95204 6748 5780 S 0,3 0,7 0:00.22 sshd 1 root 20 0 56872 6596 5208 S 0,0 0,6 0:01.29 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0,0 0,0 0:00.02 ksoftirqd/0 5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kworker/u2:0 7 root 20 0 0 0 0 S 0,0 0,0 0:00.08 rcu_sched 8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0,0 0,0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 lru-add-drain (...)
例に示したように、top
はそれぞれのプロセスだけではなく、システム全体のメモリおよびCPUの使用状態も表示します。
top
では、対話的な操作が行えます。
デフォルトでは、プロセスが使用するCPU時間の割合の降順で出力がソートされます。top
で以下のキーを押すことで、この動作を変更する事ができます。
M
-
メモリ使用量でソートします。
N
-
プロセスIDでソートします。
T
-
実行時間でソートします。
P
-
CPU利用率でソートします。
昇順と降順を切り替えるには、R
を押します。
Tip
|
|
プロセスのスナップショット ps
プロセスに関する情報を得るためのもう一つの非常に重要なコマンドは ps
です。top
が動的な情報を提供するのに対して、ps
は静的な情報を提供します。
オプションなしで起動した場合の ps
の出力は限定的で、現在のシェルにアタッチされているプロセスのみを表示します。
$ ps PID TTY TIME CMD 2318 pts/0 00:00:00 bash 2443 pts/0 00:00:00 ps
表示される情報は、プロセス識別子( PID
)、プロセスが実行されているターミナル( TTY
)、プロセスが使用したCPU時間( TIME
)、プロセスを開始したコマンド( CMD
)です。
ps
に便利なオプション -f
を指定すると、より長い形式のリストを表示します:
$ ps -f UID PID PPID C STIME TTY TIME CMD carol 2318 1682 0 08:38 pts/1 00:00:00 bash carol 2443 2318 0 08:46 pts/1 00:00:00 ps -f
他のスイッチと組み合わせると、-f
はプロセスの親子関係を表示します。
$ ps -uf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND carol 2318 0.0 0.1 21336 5140 pts/1 Ss 08:38 0:00 bash carol 2492 0.0 0.0 38304 3332 pts/1 R+ 08:51 0:00 \_ ps -uf carol 1780 0.0 0.1 21440 5412 pts/0 Ss 08:28 0:00 bash carol 2291 0.0 0.7 305352 28736 pts/0 Sl+ 08:35 0:00 \_ emacs index.en.adoc -nw (...)
ps
コマンドに -v
オプションを付けて実行すると、使用メモリの割合を表示することもできます。
$ ps -v PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 1163 tty2 Ssl+ 0:00 1 67 201224 5576 0.1 /usr/lib/gdm3/gdm-x-session (...) (...)
Note
|
プロセスの階層をわかりやすく示すコマンドに |
/proc
ディレクトリのプロセス情報
既に /proc
ファイルシステムを見ました。/proc
には、システムで実行中のプロセス毎に名前が番号のサブディレクトリ(番号はプロセスの PID
)が含まれています。
carol@debian:~# ls /proc 1 108 13 17 21 27 354 41 665 8 9 10 109 14 173 22 28 355 42 7 804 915 103 11 140 18 23 29 356 428 749 810 918 104 111 148 181 24 3 367 432 75 811 105 112 149 19 244 349 370 433 768 83 106 115 15 195 25 350 371 5 797 838 107 12 16 2 26 353 404 507 798 899 (...)
つまり、特定のプロセスに関するすべての情報が、そのディレクトリに含まれています。PID
が 1
である最初のプロセスの内容を見てみましょう。(読みやすいように出力を省略しています)。
# ls /proc/1/ attr cmdline environ io mem ns autogroup comm exe limits mountinfo numa_maps auxv coredump_filter fd loginuid mounts oom_adj ...
例えば、プロセスの実行ファイルを見てみましょう:
# cat /proc/1/cmdline; echo /sbin/init
このように、プロセス階層の先頭の実行ファイルは /sbin/init
です。
Note
|
セミコロン( |
システムの負荷
それぞれのプロセスは、システムリソースを消費する可能性があります。システムの負荷と言った場合には、システム全体の負荷を集約して1つの数値で示すことにします。現在の負荷は、uptime
コマンドで見ることができます。
$ uptime 22:12:54 up 13 days, 20:26, 1 user, load average: 2.91, 1.59, 0.39
末尾の3つの数値がシステムの平均負荷(ロードアベレージ)を示しています。2.91
は直近の1分間、1.59
は5分前、0.39
は15分前の負荷をそれぞれ示しています。
これらの数値は、CPUリソースないしは入出力操作の完了を待っていたプロセスの数を示します。これは、プロセスが必要とするリソースを得ていれば、実行可能な状態であったことを意味しています。
システムログとシステムメッセージ
カーネルとプロセス群が実行され相互のやりとりが始まると、大量の情報が生成されます。ほとんどのものはログファイルないし簡単に ログ (log)と呼ばれるファイルに送られます。
ログがなければサーバーで発生したイベントを探すことがシステム管理者にとっての頭痛の種になりますから、システムイベントを追跡するための標準化および一元化された方法が必要です。さらにログは、統計や傾向予測を行うための信頼できる情報源であり、トラブルシューティングやセキュリティ対策の際の決定要因となるものです。
syslogデーモンによるロギング
伝統的に、システムメッセージは、syslog あるいはその派生である syslog-ng や rsyslog など、標準のロギング機能によって管理されてきました。ロギングデーモンは、他のサービスやプログラムからメッセージを集めて、それらを通常は /var/log
にあるログファイルに保管します。ただし一部のサービス(例えば Apache HTTPD web server)は独自にログを処理します。また、Linuxカーネルは、ログメッセージをメモリ内のリングバッファに格納します。
/var/log
にあるログファイル
ログは時間と共に変化するデータであるため、通常は /var/log
に置かれます。
/var/log
を覗いてみると、ログの名前は(程度の差はあれ)自明なことがわかるでしょう。いくつかの例を挙げます:
/var/log/auth.log
-
認証に関する情報を収めます。
/var/log/kern.log
-
カーネルの情報を収めます。
/var/log/syslog
-
システムの情報を収めます。
/var/log/messages
-
システムとアプリケーションのデータを収めます。
Note
|
ログファイルの名前と内容は、ディストリビューションによって異なります。 |
ログファイルにアクセスする
ログファイルを探索するときは、(読み出しパーミッションが無い場合)rootになることと、less
の様なページャーを使用しましょう。
# less /var/log/messages Jun 4 18:22:48 debian liblogging-stdlog: [origin software="rsyslogd" swVersion="8.24.0" x-pid="285" x-info="http://www.rsyslog.com"] rsyslogd was HUPed Jun 29 16:57:10 debian kernel: [ 0.000000] Linux version 4.9.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.130-2 (2018-10-27) Jun 29 16:57:10 debian kernel: [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-8-amd64 root=/dev/sda1 ro quiet
あるいは tail
に -f
オプションを指定して、ファイルの末尾に追加された直近のメッセージを動的に表示することもできます。
# tail -f /var/log/messages Jul 9 18:39:37 debian kernel: [ 2.350572] RAPL PMU: hw unit of domain psys 2^-0 Joules Jul 9 18:39:37 debian kernel: [ 2.512802] input: VirtualBox USB Tablet as /devices/pci0000:00/0000:00:06.0/usb1/1-1/1-1:1.0/0003:80EE:0021.0001/input/input7 Jul 9 18:39:37 debian kernel: [ 2.513861] Adding 1046524k swap on /dev/sda5. Priority:-1 extents:1 across:1046524k FS Jul 9 18:39:37 debian kernel: [ 2.519301] hid-generic 0003:80EE:0021.0001: input,hidraw0: USB HID v1.10 Mouse [VirtualBox USB Tablet] on usb-0000:00:06.0-1/input0 Jul 9 18:39:37 debian kernel: [ 2.623947] snd_intel8x0 0000:00:05.0: white list rate for 1028:0177 is 48000 Jul 9 18:39:37 debian kernel: [ 2.914805] IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready Jul 9 18:39:39 debian kernel: [ 4.937283] e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX Jul 9 18:39:39 debian kernel: [ 4.938493] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready Jul 9 18:39:40 debian kernel: [ 5.315603] random: crng init done Jul 9 18:39:40 debian kernel: [ 5.315608] random: 7 urandom warning(s) missed due to ratelimiting
出力には次のようなものが含まれます。
-
タイムスタンプ(日時)
-
メッセージを生成したホスト名
-
メッセージを生成したプログラム/サービスの名前
-
メッセージを生成したプログラムのPID
-
行われた動作
ほとんどのログファイルはプレーンテキストファイルですが、/var/log/wtmp
(成功したログインを記録する)のようにバイナリデータを含むものもあります。file
コマンドを使ってどちらかを判断することができます。
$ file /var/log/wtmp /var/log/wtmp: dBase III DBT, version number 0, next free block index 8
バイナリのファイルは、特別なコマンドを使って読み込むのが普通です。/var/log/wtmp
のデータを解釈するには last
を使います。
$ last carol tty2 :0 Thu May 30 10:53 still logged in reboot system boot 4.9.0-9-amd64 Thu May 30 10:52 still running carol tty2 :0 Thu May 30 10:47 - crash (00:05) reboot system boot 4.9.0-9-amd64 Thu May 30 09:11 still running carol tty2 :0 Tue May 28 08:28 - 14:11 (05:42) reboot system boot 4.9.0-9-amd64 Tue May 28 08:27 - 14:11 (05:43) carol tty2 :0 Mon May 27 19:40 - 19:52 (00:11) reboot system boot 4.9.0-9-amd64 Mon May 27 19:38 - 19:52 (00:13) carol tty2 :0 Mon May 27 19:35 - down (00:03) reboot system boot 4.9.0-9-amd64 Mon May 27 19:34 - 19:38 (00:04)
Note
|
|
ログローテーション
ログファイルは数週間・数ヶ月にわたって成長し続けて、すべての空きディスクを使い果たしてしまうかもしれません。これに対処するのが logrotate
です。これは、ログファイルのアーカイブや圧縮、ファイル名の変更、古いものの削除、場合によってはシステム管理者へのメール送信など、ローテーションや循環を実装したものです。ローテートされたログファイルの命名規則は(サフィックスに日付を加えるなど)多岐にわたりますが、単に整数をサフィックスに追加するのが一般的です。
# ls /var/log/apache2/ access.log error.log error.log.1 error.log.2.gz other_vhosts_access.log
error.log.2.gz
は(サフィックス .gz
で分かるように)既にgzipで圧縮されていることに注意しましょう。
カーネル リング バッファ
カーネルリングバッファは、カーネルからのメッセージを記録する固定サイズのデータ構造です。このバッファの極めて重要な役割は、syslog
が利用可能となる前の、ブート時のカーネルからのメッセージを記録することです。dmesg
コマンドは、このカーネルリングバッファーの内容(以前は /var/log/dmesg
にも保存されていました)を表示します。リングバッファはかなり大きいので、このコマンドは通常、テキストをフィルタリングする grep
や less
と組み合わせて使用します。例えば、ブートメッセージを表示するには次のようにします:
$ dmesg | grep boot [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet [ 0.000000] smpboot: Allowing 1 CPUs, 0 hotplug CPUs [ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet [ 0.144986] AppArmor: AppArmor disabled by boot time parameter (...)
Note
|
カーネルリングバッファは、新しいメッセージで上書きされて、古いものは消えてしまいます。 |
sysstemd-journald のシステムジャーナル
2015年の時点で、ほとんどの主要なLinuxディストリビューションでは、systemd が 事実上の標準の システム/サービスマネージャとして SysV Init に取って代わりました。ジャーナルデーモン journald
が標準的なロギングのコンポーネントとなり、ほとんどの面で syslog の代わりとなりました。データはプレーンテキストではなくバイナリ形式でストアされます。ログを参照するためには journalctl
ユーティリティが必要です。journald は syslog と互換性があり統合することができます。
journalctl
は、systemdのジャーナルを調べためのユーティリティです。オプションなしで起動すると、すべてのジャーナルを表示します:
# journalctl -- Logs begin at Tue 2019-06-04 17:49:40 CEST, end at Tue 2019-06-04 18:13:10 CEST. -- jun 04 17:49:40 debian systemd-journald[339]: Runtime journal (/run/log/journal/) is 8.0M, max 159.6M, 151.6M free. jun 04 17:49:40 debian kernel: microcode: microcode updated early to revision 0xcc, date = 2019-04-01 Jun 04 17:49:40 debian kernel: Linux version 4.9.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) Jun 04 17:49:40 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-8-amd64 root=/dev/sda1 ro quiet (...)
-k
ないし --dmesg
オプションを指定すると、dmesg
コマンドと同じになります。
# journalctl -k [ 0.000000] Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13) [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet (...)
journalctl
の興味深いオブションを以下に示します:
-b
,--boot
-
ブートに関する情報を表示します。
-u
-
指定のユニットに関するメッセージを表示します。ユニットとは大まかに、systemd が扱うリソースのことです。例えば、
journalctl -u apache2.service
は、apache2
Webサーバーに関連するメッセージを読み出します。 -f
-
直近のジャーナルメッセージを表示して、
tail -f
と同様に、ジャーナルに追加された新しくエントリを表示し続けます。
演習
-
次の
top
の出力を見て、以下の問題に答えて下さい:carol@debian:~$ top top - 13:39:16 up 31 min, 1 user, load average: 0.12, 0.15, 0.10 Tasks: 73 total, 2 running, 71 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.1 us, 0.4 sy, 0.0 ni, 98.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1020332 total, 698700 free, 170664 used, 150968 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 710956 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 605 nobody 20 0 1137620 132424 34256 S 6.3 13.0 1:47.24 ntopng 444 www-data 20 0 364780 4132 2572 S 0.3 0.4 0:00.44 apache2 734 root 20 0 95212 7004 6036 S 0.3 0.7 0:00.36 sshd 887 carol 20 0 46608 3680 3104 R 0.3 0.4 0:00.03 top 1 root 20 0 56988 6688 5240 S 0.0 0.7 0:00.42 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.87 kworker/0:0 (...)
-
ユーザー
carol
が開始したプロセスは何ですか? -
top
コマンドに関するデータを見つけるには、/proc
仮想ディレクトリのどこを見ればよいですか? -
最初に実行されたプロセスは何でしょう? どうしてそれが分かりますか?
-
top
の出力のどこを見ればそれぞれの情報が 分かるかを答えて、以下の表を完成させて下さい:情報 サマリー部 タスク部 メモリ
スワップ
PID
CPU時間
コマンド
-
-
以下に示すバイナリ形式のログを見るために使用するコマンドは何でしょうか?
-
/var/log/wtmp
-
/var/log/btmp
-
/run/log/journal/2a7d9730cd3142f4b15e20d6be631836/system.journal
-
-
Linuxシステムの以下の情報を調べるために、
grep
と組み合わせて使用するコマンドは何でしょうか?-
システムが最後にいつリブートしたか(
wtmp
) -
接続されているハードディスク(
kern.log
) -
いつ最後にログインしたか(
auth.log
)
-
-
カーネルリングバッファを表示するために利用できる2つのコマンドは何でしょう?
-
以下のログメッセージは、どこにあるかを答えて下さい。
-
Jul 10 13:37:39 debian dbus[303]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 11:23:58 debian kernel: [ 1.923349] usbhid: USB HID core driver
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 14:02:53 debian sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0)
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 11:23:58 debian NetworkManager[322]: <info> [1562750638.8672] NetworkManager (version 1.6.2) is starting…
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
-
以下のユニットに関する情報を得るには、
journalctl
にどのように問い合わせますか?ユニット コマンド ssh
networking
rsyslog
cron
発展演習
-
演習にある
top
の出力を再度確認して、以下の問いに答えましょう:-
apache Webサーバーを終了するために実行する2つのステップは何でしょう?
-
サマリー部において物理メモリとスワップ領域の情報をプログレスバーを使って表示するにはどうしますか?
-
メモリ使用量によってプロセスをソートしましょう:
-
ここまでに、メモリ情報をプログレスバーに表示して、メモリ使用量に応じてプロセスがソートされているはずです。この設定を保存して、次に
top
を使うときのデフォルトとするにはどうしますか? -
top
の設定を保存するファイルは何ですか? それはどこにありますか? 存在を確認してみましょう。
-
-
Bashの
exec
コマンドを試して学びましょう。Bashのセッションを開始して、ps
で Bashのプロセスをメモします。次にexec /bin/sh
を実行してから、同じPIDを再度探してみましょう。 -
以下の手順を実行して、カーネルイベントと udevによる動的なデバイス管理を探索しましょう:
-
USBドライブをコンピュターセットします。
dmesg
を実行して、最後の行に注目します。最後の行はどうなっていますか? -
前のコマンドの出力を念頭において、
ls /dev/sd*
を実行してリストに USBドライブが現れることを確認します。出力は何ですか? -
次にUSBドライブを取り外して、再度
dmesg
を実行します。最後の行はどうなっていますか? -
再度
ls /dev/sd*
を実行して、リストからUSBドライブが無くなったことを確認します。出力は何ですか?
-
まとめ
このレッスンでは、データの格納場所について以下を学びました: プロセス管理、システムのログとメッセージ。
プロセス管理については、以下の事柄を学びました:
-
プログラムは階層構造の中にプロセスを生成します。
-
それぞれのプロセスは一意のID(
PID
)と、親プロセスのID(PPID
)を持ちます。 -
top
はシステムで実行中のプロセスを動的かつ対話的に探索するとても有用なコマンドです。 -
ps
はシステムでその時に実行中のプロセスのスナップショットを取得します。 -
/proc
ディレクトリには、システムで実行中のすべてのプロセスについて、そのPIDを名前とするサブディレクトリがあります。 -
ロードアベレージの概念。CPUの利用率や過負荷を確認できます。
ログについては、以下の事柄を覚えておきましょう:
-
ログはシステムイベントが記録されるファイルです。トラブルシューティングの際に極めて有用です。
-
伝統的には、ログは syslog や syslog-ng、rsyslogといった専用のサービスで処理されていました。一部のプログラムは、独自のログデーモンを使用します。
-
ログは可変データであるため
/var
に置かれます。場合によっては、その名前が内容の手がかりになることがあります(kern.log
やauth.log
など)。 -
ほとんどのログはプレーンテキストで、パーミッションがあればテキストエディタで見ることができます。ただし、いくつかはバイナリファイルであり、特別なコマンドで見なくてはなりません。
-
ディスク容量の問題を避けるために、logrotate ユーティリティによって
ログローテーション
が行われます。 -
カーネルは リングバッファ という円環状のデータ構造にブート時のメッセージなどを保持します(古いメッセージは上書きされて消えていきます)。
-
システムとサービスのマネージャである systemd は、ほとんどのディストリビューションで System V init を journald で置き換えて、それをロギングサービスの標準としました。
-
システムジャーナルを読むには、
journalctl
ユーティリティが必要です。
このレッスンで使用したコマンド:
cat
-
ファイルの内容を結合ないし表示します。
dmesg
-
カーネルリングバッファを表示します。
echo
-
1行のテキストないし改行を表示します。
file
-
ファイルの種類を識別します。
grep
-
パターンに一致した行を表示します。
last
-
直近にログインしたユーザーのリストを表示します。
less
-
1ページずつファイルの内容を表示します。
ls
-
ディレクトリの内容を一覧表示します。
journalctl
-
systemd
のジャーナルを取得します。 tail
-
ファイル末尾の行を表示します。
演習の解答
-
次の
top
の出力を見て、以下の問題に答えて下さい:carol@debian:~$ top top - 13:39:16 up 31 min, 1 user, load average: 0.12, 0.15, 0.10 Tasks: 73 total, 2 running, 71 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.1 us, 0.4 sy, 0.0 ni, 98.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1020332 total, 698700 free, 170664 used, 150968 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 710956 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 605 nobody 20 0 1137620 132424 34256 S 6.3 13.0 1:47.24 ntopng 444 www-data 20 0 364780 4132 2572 S 0.3 0.4 0:00.44 apache2 734 root 20 0 95212 7004 6036 S 0.3 0.7 0:00.36 sshd 887 carol 20 0 46608 3680 3104 R 0.3 0.4 0:00.03 top 1 root 20 0 56988 6688 5240 S 0.0 0.7 0:00.42 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.87 kworker/0:0 (...)
-
ユーザー
carol
が開始したプロセスは何ですか?答え: ひとつの
top
だけです。 -
top
コマンドに関するデータを見つけるには、/proc
仮想ディレクトリのどこを見ればよいですか?答え:
/proc/887
-
最初に実行されたプロセスは何でしょう? どうしてそれが分かりますか?
答え:
systemd
です。PID
が1
だからです。 -
top
の出力のどこを見ればそれぞれの情報が 分かるかを答えて、以下の表を完成させて下さい:情報 サマリー部 タスク部 メモリ
○
○
スワップ
○
×
PID
×
○
CPU時間
○
○
コマンド
×
○
-
-
以下に示すバイナリ形式のログを見るために使用するコマンドは何でしょうか?
-
/var/log/wtmp
答え:
last
-
/var/log/btmp
答え:
lastb
-
/run/log/journal/2a7d9730cd3142f4b15e20d6be631836/system.journal
答え:
journalctl
-
-
Linuxシステムの以下の情報を調べるために、
grep
と組み合わせて使用するコマンドは何でしょうか?-
システムが最後にいつリブートしたか(
wtmp
)答え:
last
-
接続されているハードディスク(
kern.log
)答え:
less /var/log/kern.log
-
いつ最後にログインしたか(
auth.log
)答え:
less /var/log/auth.log
-
-
カーネルリングバッファを表示するために利用できる2つのコマンドは何でしょう?
dmesg
とjournalctl -k
(あるいはjournalctl --dmesg
) -
以下のログメッセージは、どこにあるかを答えて下さい。
-
Jul 10 13:37:39 debian dbus[303]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
○
/var/log/messages
-
Jul 10 11:23:58 debian kernel: [ 1.923349] usbhid: USB HID core driver
/var/log/auth.log
/var/log/kern.log
○
/var/log/syslog
/var/log/messages
○
Jul 10 14:02:53 debian sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0)
/var/log/auth.log
○
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 11:23:58 debian NetworkManager[322]: <info> [1562750638.8672] NetworkManager (version 1.6.2) is starting…
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
○
-
-
以下のユニットに関する情報を得るには、
journalctl
にどのように問い合わせますか?ユニット コマンド ssh
journalctl -u ssh.service
networking
journalctl -u networking.service
rsyslog
journalctl -u rsyslog.service
cron
journalctl -u cron.service
発展演習の解答
-
演習にある
top
の出力を再度確認して、以下の問いに答えましょう:-
apache Webサーバーを終了するために実行する2つのステップは何でしょう?
まず
k
を押して、kill
する値を指定します。 -
サマリー部において物理メモリとスワップ領域の情報をプログレスバーを使って表示するにはどうしますか?
m
を1回ないし2回押します。 -
メモリ使用量によってプロセスをソートしましょう:
M
-
ここまでに、メモリ情報をプログレスバーに表示して、メモリ使用量に応じてプロセスがソートされているはずです。この設定を保存して、次に
top
を使うときのデフォルトとするにはどうしますか?W
-
top
の設定を保存するファイルは何ですか? それはどこにありますか? 存在を確認してみましょう。ファイルは
~/.config/procps/toprc
で、ユーザーのホームディレクトリ(~
)にあります。これは隠しファイル(ドットから始まる名前のディレクトリにあるので)なので、存在を確認するにはls -a
(すべてのファイルをリストする)を使います。top
の中で kbd:[Shift+W] を押すと生成されます。
-
-
Bashの
exec
コマンドを試して学びましょう。Bashのセッションを開始して、ps
で Bashのプロセスをメモします。次にexec /bin/sh
を実行してから、同じPIDを再度探してみましょう。exec
は、プロセスを他のコマンドで置き換えます。次の例では Bashのプロセスが/bin/sh
に置き換えられることを確認できます(/bin/sh
は子プロセスになりません)。$ echo $$ 19877 $ ps auxf | grep 19877 | head -1 carol 19877 0.0 0.0 7448 3984 pts/25 Ss 21:17 0:00 \_ bash $ exec /bin/sh sh-5.0$ ps auxf | grep 19877 | head -1 carol 19877 0.0 0.0 7448 3896 pts/25 Ss 21:17 0:00 \_ /bin/sh
-
以下の手順を実行して、カーネルイベントと udevによる動的なデバイス管理を探索しましょう:
-
USBドライブをコンピュターセットします。
dmesg
を実行して、最後の行に注目します。最後の行はどうなっていますか?[ 1967.700468] sd 6:0:0:0: [sdb] Attached SCSI removable disk
のような行が見れるはずです。 -
前のコマンドの出力を念頭において、
ls /dev/sd*
を実行してリストに USBドライブが現れることを確認します。出力は何ですか?システムに何台のデバイスが接続されているかによりますが、
/dev/sda /dev/sda1 /dev/sdb /dev/sdb1 /dev/sdb2
のような結果が得られるはずです。この例では、USBデバイス (/dev/sdb
)とその2つのパーティション(/dev/sdb1
と/dev/sdb2
)があります。 -
次にUSBドライブを取り外して、再度
dmesg
を実行します。最後の行はどうなっていますか?[ 2458.881695] usb 1-9: USB disconnect, device number 6
のような行が見れるはずです。 -
再度
ls /dev/sd*
を実行して、リストからUSBドライブが無くなったことを確認します。出力は何ですか?ここの例では、
/dev/sda /dev/sda1
です。
-