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

辻本

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

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

ps(1)を見ることで、すべて調べることが出来ます。

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

viを起動後、他の端末から

$ 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が分かったので

$ kill -TERM 3366

として終了できます。

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

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

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

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

問題(7)
sample_linkの内容を適当に変更し保存せよ。その結果sampleの内容が書き換わっていることを確認せよ。

エディタで編集したり、リダイレクトしたりすることで内容を変更します。

$ echo foo > sample_link
$ cat sample
foo
問題(8)
ディレクトリsample_dirを作成し(ディレクトリの中にファイルを1つ以上作成すること)、それに対してシンボリックリンクsample_link_dirを作成せよ。
$ 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のそれと同じであることを確認せよ。
$ ls -F sample_link_dir/
a  b  c
問題(10)
作成したシンボリックリンクを削除せよ。
$ ls -F
sample  sample_dir/  sample_link@  sample_link_dir@

$ rm sample_link sample_link_dir

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

$ 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はなんなのかというと

$ 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)が起動していることを確かめよ。
$ 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.*ディレクトリ中にどのような実行ファイルがあるか確認せよ。
$ 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