Skip to content

Linux リテラシ - 第4回 演習問題 解答

This content is not available in your language yet.

一般にプロンプト文字列が「$」のときは一般ユーザー、「#」のときはrootでそのコマンドを実行することを表します。

:問題(1):psコマンドとそのオプションについて調べ、「ps aux」がなにをするものなのか確かめよ。
ps(1)を見ることで、すべて調べることが出来ます。

:問題(2):viを起動した状態でさらに別の端末を開きvi(vim)プロセスがあることを確かめよ。
viを起動後、他の端末から

Terminal window
$ ps aux | grep vi
user 3366 6.0 0.8 11092 2980 pts/2 S+ 18:15 0:00 vim
user 3368 0.0 0.2 5076 760 pts/1 R+ 18:15 0:00 grep vi

ちなみにviではなくvimが立ち上がっているのは次のようにエイリアスが設定されているためです。

alias vi='vim'

:問題(3):vi(vim)プロセスに対してTERMシグナルを送って終了させよ。
問題2より該当プロセスのPIDが分かったので

Terminal window
$ kill -TERM 3366

として終了できます。

:問題(4):sleepはオプションに数値を与えるとその秒数だけ停止し続けるコマンドである。これを使って1分間停止するプロセスを作り出し、それを中断させよ。

Terminal window
$ sleep 60

としてから、Ctrl+cを入力してください。

:問題(5):ファイルsampleを作成し(内容はなんでもよい)、それに対してシンボリックリンクsample_linkを作成せよ。

Terminal window
$ echo dummy > sample
$ cat sample_link
dummy
$ ln -s sample sample_link

:問題(6):sample_linkの内容を表示しsampleのそれと同じであることを確認せよ。

Terminal window
$ cat sample_link
dummy

:問題(7):sample_linkの内容を適当に変更し保存せよ。その結果sampleの内容が書き換わっていることを確認せよ。
エディタで編集したり、リダイレクトしたりすることで内容を変更します。

Terminal window
$ echo foo > sample_link
$ cat sample
foo

:問題(8):ディレクトリsample_dirを作成し(ディレクトリの中にファイルを1つ以上作成すること)、それに対してシンボリックリンクsample_link_dirを作成せよ。

Terminal window
$ mkdir sample_dir
$ touch sample_dir/{a,b,c}
$ ls -F sample_dir/
a b c
$ ln -s sample_dir sample_link_dir

:問題(9):sample_link_dirの内容を表示しsample_dirのそれと同じであることを確認せよ。

Terminal window
$ ls -F sample_link_dir/
a b c

:問題(10):作成したシンボリックリンクを削除せよ。

Terminal window
$ ls -F
sample sample_dir/ sample_link@ sample_link_dir@
$ rm sample_link sample_link_dir

シンボリックリンクを削除しても、リンク先のファイルまでは削除されません。

Terminal window
$ ls -F
sample sample_dir/

:問題(11):/etc/inittabを書き換えランレベルを3にし再起動せよ。
/etc/inittabを次のように書き換えて再起動します。

--- /etc/inittab.orig 2005-06-14 13:22:17.625459696 +0900
+++ /etc/inittab 2005-06-14 13:22:33.587033168 +0900
@@ -15,7 +15,7 @@
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
-id:5:initdefault:
+id:3:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

なおこのフォーマットのことをunified diff形式といいファイルへの変更を示すのによく使われます。
変更前のファイル/etc/inittab.orig(/etc/inittabのオリジナル、を意味します)と変更後の/etc/inittabを比較し、
削除された行の先頭に「-」、追加された行の先頭に「+」を付けて表示しています。

:問題(12):ランレベルを5にし再起動せよ。
問題11と逆の事を行います。

:問題(13):ntsysv、chkconfig —list、ls /etc/rc.d/rc5.dの結果を見比べそれぞれの対応を確かめよ。
今はランレベル5なので、ntsysvでチェックが付いているものはchkconfigで「5:on」と表示されており、
また/etc/rc.d/rc5.dにSで始まるシンボリックリンクがあるはずです。

ntsysvとの比較は目で確認する必要があるために面倒ですが、chkconfigと/etc/rc.d/rc5.dとの比較は
(やろうと思えば)次のようにして一回で行うことが出来ます。

# diff -u <(chkconfig --list|grep '5:on'|awk '{print $1}'|sort) \
<(ls /etc/rc.d/rc5.d/S*|sed 's/^.*S[0-9][0-9]//g'|sort)
--- /dev/fd/63 2005-06-14 14:55:03.644296216 +0900
+++ /dev/fd/62 2005-06-14 14:55:03.681290592 +0900
@@ -15,6 +15,7 @@
irqbalance
isdn
kudzu
+local
mdmonitor
messagebus
netfs

この出力結果は、chkconfigの出力に含まれていないもの(local)が/etc/rc.d/rc5.dにあるということを示しています。
ではこのlocalはなんなのかというと

Terminal window
$ ls -lF /etc/rc.d/rc5.d/S*local
lrwxrwxrwx 1 root root 11 5月 23 20:41 /etc/rc.d/rc5.d/S99local -> ../rc.local*

このように/etc/rc.d/rc.localへのシンボリックリンクとなっています。起動スクリプトではないのでchkconfigでは管理していないというわけです。

:問題(14):SSHデーモン(sshd)が起動していることを確かめよ。

Terminal window
$ ps aux|grep sshd
root 1883 0.0 0.4 5772 1660 ? Ss 13:08 0:00 /usr/sbin/sshd
user 13682 0.0 0.0 1644 184 tty2 R+ 15:25 0:00 grep sshd

:問題(15):SSHデーモンを停止し、プロセスがなくなったことを確かめよ。
起動スクリプトを利用して停止させます。

# /etc/init.d/sshd stop
$ ps aux|grep sshd
user 13708 0.0 0.2 5080 764 tty2 R+ 15:26 0:00 grep sshd

:問題(16):SSHデーモンを起動せよ。

# /etc/init.d/sshd start

:問題(17):/etc/rc.d/rc5.dにある/etc/init.d/sshdへのシンボリックリンクを削除せよ。その後ntsysvを起動しsshdのチェックが外れていることを確認せよ。

# rm /etc/rc.d/rc5.d/S*sshd
# ntsysv

なおこのままではsshdへのチェックは外れたままになります。気になる人は再設定してください。

:問題(18):tailに-fオプションをつけて/var/log/messagesを開け。その状態で別の端末からsuを使って別のユーザーになり、どのようなログが出力されるか確認せよ。

# tail -f /var/log/messages

この状態でユーザーuserにログインすると次のようなログが出力されます。

Jun 14 15:18:13 localhost su(pam_unix)[13593]: session opened for user root by user(uid=500)

:問題(19):続けてもう1回suを実行せよ。ただし、今度はわざとパスワード入力を間違えること。そのとき、/var/log/messagesにどのようなログが出力されるか確認せよ。
認証が失敗したことを示すログが出力されます。

Jun 14 15:19:10 localhost su(pam_unix)[13635]: authentication failure; logname=user uid=500 euid=0 tty= ruser=user rhost= user=root

:問題(20):/etc/cron.*ディレクトリ中にどのような実行ファイルがあるか確認せよ。

Terminal window
$ ls -F /etc/cron.*
/etc/cron.deny
/etc/cron.d:
/etc/cron.daily:
00-logwatch@ 0anacron* prelink* slocate.cron* tmpwatch*
00-makewhatis.cron* logrotate* rpm* tetex.cron* yum.cron*
/etc/cron.hourly:
/etc/cron.monthly:
0anacron*
/etc/cron.weekly:
00-makewhatis.cron* 0anacron*

ログ解析結果の通知、ファイル検索用のデータベースの更新、ログのローテート、パッケージの更新などを行うためのスクリプトがあります。

:問題(21):/var/log/cronを見てどのようなものが実際にcronによって実行されているか確認せよ。

# less /var/log/cron

:問題(22):約5分後に/cron.testというディレクトリが作成されるようcronの設定をせよ。
現在時刻の5分後にディレクトリが作成されるようcrontabを使って登録します。仮に現在時刻が00:00だとすると、

# crontab -e
5 0 * * * mkdir /cron.test

と編集して保存することで、00:05にディレクトリが作成されます。
この指定の仕方だと毎日このコマンドが実行されることに注意してください。

:問題(23):/var/log/cronにどのようなログが出力されたか確認せよ。
次のようなログが出力され、コマンドが実行されたことが確認できます。

Jun 14 00:05:01 localhost crond[4284]: (root) CMD (mkdir /cron.test)

:問題(24):実行できたことを確認したら、問題22で作成したエントリを削除せよ。
再びcrontabコマンドを実行し、該当行を削除して保存してください。

# crontab -l
5 0 * * * mkdir /cron.test
# crontab -e
(削除)
# crontab -l