2008年05月13日
情報科学類 コンピュータリテラシ
                                       筑波大学 システム情報工学研究科 
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
	http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2008/2008-05-13
あるいは、次のページから手繰っていくこともできます。
	http://www.coins.tsukuba.ac.jp/~yas/
	http://www.cs.tsukuba.ac.jp/~yas/
「端末」を複数開くと、「シェル」のプロセスが2つ。 プログラムとしては、同じ tcsh だが、プロセスとしては別物になる。
その昔は、1度に1個のプログラムだけしかメモリに入れられなかった。 (プログラムとプロセスの違いが希薄。)
% ls 
% ps 
  PID  TT  STAT      TIME COMMAND
 4641  p2  S      0:00.54 -tcsh
 4676  p2  S      0:01.25 emacs
 4790  p2  S      0:00.02 lv index.html-m4
 4650  p3  S      0:00.10 -tcsh
 4671  p3  S+     0:00.57 vin
 4782  p4  S      0:00.06 -tcsh
 4788  p4  S+     0:01.10 emacs -nw
% 
1行が1プロセスに対応。左から次のような意味を持つ。
/dev/ttyp3は
p3になる。
R (runnable)
U (uninterruptible), D (Disk), 
S (Sleep)、I (Idle)
Z (Zombie)
T (Traced)
TIME
COMMAND
% ps x 
% ps u 
USER   PID %CPU %MEM      VSZ    RSS  TT  STAT STARTED      TIME COMMAND
yas   4641   0.0 -0.1    31832   1152  p2  S     6:22PM   0:00.54 -tcsh
yas   4650   0.0 -0.0    31832    956  p3  S     6:22PM   0:00.10 -tcsh
yas   4671   0.0 -0.2    31492   4532  p3  S+    6:23PM   0:00.59 vin
yas   4676   0.0 -0.6    52184  11624  p2  S     6:24PM   0:01.25 emacs
yas   4782   0.0 -0.0    31832    952  p4  S     6:26PM   0:00.06 -tcsh
yas   4788   0.0 -0.6    52184  11676  p4  S+    6:26PM   0:01.10 emacs -nw
yas   4790   0.0 -0.0    27916    532  p2  S     6:27PM   0:00.02 lv index.html-
% 
%CPU
%MEM
VSZ (Virtual Size)
RSS (resident set size)
STARTED
親子関係により、プロセスは全体として木構造を作る。
親プロセスのプロセス識別子は、psコマンドに「l」オプションをつけると PPIDのところに表示される。
% ps l 
  UID   PID  PPID CPU PRI NI      VSZ    RSS WCHAN  STAT  TT       TIME COMMAND
 1013  4641  4640   0  31  0    31832   1156 -      S     p2    0:00.56 -tcsh
 1013  4676  4641   0  31  0    52220  12284 -      S+    p2    0:02.51 emacs
 1013  4801  4641   0  31  0    28468    660 -      S     p2    0:00.01 lv inde
 1013  4650  4649   0  31  0    31832    956 -      S     p3    0:00.10 -tcsh
 1013  4671  4650   0  31  0    31492   4536 -      S+    p3    0:00.86 vin
 1013  4782  4781   0  31  0    31832    948 -      S     p4    0:00.06 -tcsh
 1013  4788  4782   0  31  0    52184  11684 -      S+    p4    0:01.10 emacs -
 1013  4805  4676   0  31  0    31832   1060 -      Ss    p5    0:00.36 -bin/tc
% 
Unix では、プロセスを殺す方法は、主に次の2つ。
% cat 
Line 1
Line 1
Line 2
Line 2
^C
% 
^C と同様に ^\
(「^\」または「^¥」)
もプロセスを強制終了させるキーで
ある。^\ は、^Cが利かないときでも利くことがある。
^\ の場合、デバッグ用にcore という名前のファイル
ができる。普段は、core ファイルは不要なので、^C を使うべ
きである。
coins の環境では、core ファイルが作られないように設定されている。 core ファイルの利用方法は、デバッガ gdb のマニュアル、 man core (core ファイルの man ページ(man コマンドで表示されるページ))、 Unix Super Text 下巻 「第60章 デバッグの方法」を参照。
stty コマンドを使うと、^C や ^\ を変更でき
る。
% stty -a 
speed 9600 baud; 40 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
        -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
        -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -ignbrk
        brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
        -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ;
        eol2 = ; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
        min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
        stop = ^S; susp = ^Z; time = 0; werase = ^W;
% 
  
「intr」のところに表示されるものが「^C」,
「quit」のところに表示されるものが「^\」に相当するキー。
「kill」は、1行削除の意味。
^C や ^\ で死なないプロセス
(emacs など)
を殺すには、kill コマンドを使う。
% kill pid 
これは、プロセス識別子pidのプロセスを殺す。
他人のプロセスは、権限がないので殺せない。
注意:pid には、プロセス識別子となる番号を入れる。pid
と打つのではない。pid と打たれても、kill コマンドは、どのプロセスを殺せ
ばよいのかわからない。
-KILLをつけてkillコマンドを実行する。
% kill -KILL pid 
例
図? アクセス制御における主体、オブジェクト、および、操作
Unixでは、アクセス制御の主体は、プロセスである。 アクセス制御のオブジェクトは、ファイル、または、プロセスである。 操作には、次のようなものがある。
図? 実世界のユーザとUNIX中のプロセス・ファイル
Unixでは、全てのファイルやプロセスは、あるユーザの所有物である。 ファイルとプロセスには、UID が付加されている。
1人のユーザが複数のグループに属することができる。
whoamiコマンドを用いる。
% whoami 
yas
% 
この例では、この人(のプロセス)のユーザ名は、yas 。
プロセスが属しているグループのグループ名を調べるには、
groupsコマンドを用いる。
% groups 
lab wheel staff
% 
この例では、この人(のプロセス)は、
lab, wheel, staff という3つ
のグループに属している。
idコマンドも使える。
% id 
uid=1231(yas) gid=40(lab) groups=40(lab), 0(wheel), 10(staff)
%
ファイルの「内容」のアクセス3段階であるが、ファイルの「属性」次の2段 階である。
スーパー・ユーザ(super user)
は、UID が 0 。
特権ユーザ(privileged user)、
ルート(root)、
su
 (su コマンド、あるいは super user の略)ともよばれる。
 スーパーユーザのユーザ名は、慣例として
root
という文字列が使われる。
ファイルのバックアップなど、システム管理の作業には スーパー・ユーザの仕組みが必要になる。
chown コマ
ンドを用いる。ただし、スーパーユーザの権限が必要である。
ファイルをコピーして、元ファイルを消すことはできる。
ファイルの GID 属性を変更するには、chgrp コマンドを使う。
一般ユーザは、自分が属しているグループにのみ変更できる。
任意のグループに変更するには、スーパー・ユーザの権限が必要である。
% ls -l file1 
-rw-r--r--   1 yas  prof  6 May 16 03:26 file1
% chmod go-r file1 
% ls -l file1 
-rw-------   1 yas  prof  6 May 16 03:26 file1
% 
file1に対して、グループ(g)とそれ以外の人(o)に対して「読込み可」の許可を
取り除いている。
chmodは一般的には次の形式で実行する。
% chmod set file1 file2 ... 
set の形式
[ugoa][=+-][rwx]
	
ここの[ugoa]は、誰に対するアクセスの設定を変更するかを対象となる人を以
下の表から選んで並べる(複数可)。
| 文字 | 単語 | 意味 | |
| u | user | ユーザ(利用者,所有者) | |
| g | group | グループ | |
| o | others | その他 | |
| a | all | 全員、ugo と同じ | 
| 文字 | 意味 | 
| + | 許可を追加する | 
| - | 許可を除く | 
| = | 指定した許可だけとする | 
| 文字 | 単語 | 意味 | 
| r | read | 読込み可 | 
| w | write | 書込み可 | 
| x | execute | 実行可 | 
| X | execute | 実行可(所有者に対して「実行可」がある時だけ) | 
chmod には、-R (recursive)オプションがある。 これは、ディレクトリをたぐり全部変更することを意味する。
rw-r--r--
rwxr-xr-x
rwxr-xr-x
rwx------
~/Mail ディレクトリのモード
rw-r--r--
~/public_html以下のファイル)
rwxr-xr-x
public_html以下のディレクトリ)
rwxr-xr-x または rwx--x--x
~。~/public_html の親ディレクトリ)。
x ビットを出す。
rw-rw-r-- または rwxrwxr-x
r-xr-xr-x,  r-x------
rwx------になっていたら、いくら
~/public_html のモードを rwxr-xr-x にしても、アクセスで
きない。
ps プロセスの一覧の表示 ps ux プロセスの一覧の表示(BSD,Linux) ps aux プロセスの一覧の表示(BSD,Linux) stty all 端末の状態の表示(BSD) stty -a 端末の状態の表示(System V,Linux) kill PID プロセスを殺す kill -KILL PID プロセスを殺す(必殺) ls -l f1 f2 f3 ファイルの属性の表示 ls -d d1 d2 d3 ディレクトリの名前の一覧の表示 chmod [ugoa][=+-][rwx] f1 f2 f3 モード属性の変更 whoami プロセスのUID属性の表示 groups プロセスのgroups属性の表示 id プロセスのUID,GID,groups属性の表示PID はプロセス識別子。 ;
TAや教官からメールが来て、必要な返事は、次の実習時間/講義時間までに 出すこと。
coins 以外のメール・サーバを主に使うときには、~/.forward による転送の設 定を行うこと。
~/.forward
というファイルに、転送先のアドレスを書く。
たとえば、
shiro@himalaya.is.tsukuba.ac.jp に届いたメールを全て
shiro@alps.is.tsukuba.ac.jp に転送したいとする。この時、
himalaya の方のホーム・ディレクトリの下の
~/.forward に次のように書く。
shiro@alps.is.tsukuba.ac.jp単純に転送先のアドレスを書く方法では、
~/.forwardが
あるホストには、何も残らないが、コピーを残しながら、転送する方法もある。
それには、次のように自分のログイン名に\を付けたア
ドレスを含める。
\shiro, shiro@alps.is.tsukuba.ac.jp注意:「
\」は、ASCII 「5c(16進数)」である。
「\」と表示されたり「¥」と表示されることがある。
「/」ではない。
この例では、himalaya に届いた電子メールは、himalaya と
いうホストの
\shiroというユーザの
配送プログラム用メール・ボックスに入り、
さらに、shiro@alps.is.tsukuba.ac.jp にも送られる。
alps にログインした時にも、
alps と himalaya の両方のメールが読め、
また、himalaya にログインしてもやはり
alps と himalaya の両方のメールが読める
と便利に思えるかもしれない。しかし、こうすることは技術的に難しいので、
しばらくはあきらめて欲しい。
\loginnameの機能をつかっても、なかなかうまくいかない。
たとえば、次のよう
な ~/.forward を作成したと考える。(実際に実行すると危険なので、
考えるだけする。)
(alps:~/.forward) \shiro, shiro@himalaya.is.tsukuba.ac.jp
(himalaya:~/.forward) \shiro, shiro@alps.is.tsukuba.ac.jpこの状態で、
shiro@alps.is.tsukuba.ac.jp にメールが届いた
場合、次のようなことが起る。
alps にコピーが残され、かつ、
shiro@himalaya.is.tsukuba.ac.jp に送らる。
himalaya では、やはり、コピーが残され(ここまでは順調)、
さらに、shiro@alps.is.tsukuba.ac.jp に送られる(!)。
alps では、コピーが残され(2回目)、himalaya
に送られる。
himalaya では、コピーが残され(2回目)、
さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
alps では、コピーが残され(3回目)、himalaya
に送られる。
himalaya では、コピーが残され(3回目)、
さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
alps では、コピーが残され(4回目)、himalaya
に送られる。
himalaya では、コピーが残され(4回目)、
さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
3ヵ所以上でこの設定をしたとすると、中継される度にメールが増殖する。
\loginname の機能を使っていなかったとすると、コピーは
残らないが、メールが行き来するだけで、どこにも届けられずにエラーになる。
~/.forward の設定をしたら、必ず自分で自分あてに電子メールを出
して届くかテストすること。~/.forward の設定を間違えると、エラー
のメールも届かなくなるので、エラーが起こっていることさえわからなくなる。
~/.forward の機能は、もともとは、sendmail という種類のMTA の機
能である。他の MTA (qmail, postfix)でも使えるように設定していることが多い。
~/.forward の応用として、他のアドレスに電子メールを転送するの
ではなく、(サーバ上で実行される)プログラムに転送する機能がある。すな
わち、(サーバ上で)プログラムを実行して標準入力に電子メールの内容を与
えるという機能がある。これには、次のように~/.forwardに書く。
"| /program/path/name arg1 arg2 arg3 ... argn"このように、
| に続いて、プログラムのパス名と引数を書き、
全体を "" で括る。
この機能を使って、受け取った電子メールを自動的に分類したり、
spamメール
を排除したりすることができる。たとえば、MH の
slocalやprocmail と呼ば
れているプログラムがこの機能を使っている。
くわしくは、man ps を調べなさい。
% top 
% top -o cpu 
(CPU を消費している順)
MacOSX では、top コマンド自分自身が「重たい」と認識される。
その場合は、top コマンドが頻度を下げる。
% top -s 4 -o cpu 
man top でマニュアルを表示して、-o オプションと -U の使い方を
調べなさい。そして、メモリの利用順 (rsize) で表示しなさい。
-U オプションで自分自身のプロセスだけを表示しなさい。
% open "/Applications/Utilities/Activity Monitor.app" 
または、Finder で、「移動」メニューから「ユーティリティ」を
選択。「アクティビティモニタ.app」のアイコンをダブルクリック。
アクティビティモニタの表示
表示されるプロセスの範囲を変えてみなさい。
top コマンドの表示と比較しなさい。
(まず、Commandキー(
) と Option キーを左手で押し、
押しっぱなしの状態で、右手で Esc キーを一度押して離す。)
全てのプロセスの親プロセスは、PID 1 プロセスになっている(根に相当)。
システムによっては、pstree というコマンドが使える。
/tmp など、誰でも書き込みできる場所にファイルを作成すると、その
ファイルの UID 属性はどうなるか調べなさい。新たに実験用のディレクトリを
mkdir コマンドで作成しなさい。そのディレクトリのGID属性を chgrp で変更
し、その中に新たなファイルやディレクトリを作成したら、その GID がどう設
定されるかを確かめなさい。また、既存のファイルをmv コマンドで移動したら
どうなるかを調べなさい。
% ls -l ~/Library/*/Firefox/Profiles/*/.parentlock 
% ls -l  ~/Library/Thunderbird/Profiles/*/.parentlock 
「*」は、シェルのワイルドカードの機能である。
任意の文字列に適合する。詳しくは、後述する。

複数のFirefoxの同時実行
coins では、コマンドラインから次のように打つと、 ProfileManager という機能が働く。
% firefox-profilemanger  
この画面で、プロファイルの作成、削除、指定しなかった時に使われるプロファ
イルを指定することができる。(プロファイルが複数ある場合、1個目の
Firefox のプロセスを実行する時にption キーを押しながら実行すると、この
機能が働く。)
複数のプロファイルを用いればね複数の Firefox のプロセスを同時に実行する ことができる。Firefox は、もともと1つのプロセスで複数のウインドウを開 くこともできる。この2つの機能の違いと有効な利用方法を考えなさい。
以下の問題について、問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。端末の表示 (コマンドの実行結果)は、コピー&ペースト等の機能を使って提出するファイ ルに含めなさい。課題が達成されたことを示す程度には見やすいように編集し なさい。ただし、過度の編集は避けなさい。編集した部分は必要に応じて省略 記号を入れなさい。
テキスト・ファイルで、右揃えをするには、パラグラフの区切りを、空行にし た上で、M-q (Esc q, M-x fill-paragraph) の機 能を利用するとよい。
(1) 端末を2つ開きなさい。片方で強制終了させてもよいプロセスを作成しな さい。プロセスの作成方法としては、たとえば、lv コマンドでテキスト・ファ イルを表示する方法が考えられる。もう一方の端末で、そのコンピュータで動 作している自分自身のプロセスだけを ps コマンドで表示しなさい。端末と結 びついていないプロセスも含めなさい。
(2) kill コマンドを使って、(1) で作成したプロセスを殺しなさい。ps コマ ンドの結果を示し、それがきちんと死んだことを示しなさい。
(3) まず、適当な内容を持つテキスト・ファイルを作成しなさい。そして、次 のような要求を満たすように chmod コマンドを使ってモードを変更しなさい。 提出するファイルには、chmod コマンドをどのように利用したか、また、その 結果 ls -l の表示がどのようになったかを含めなさい。
(4) 電子メールの転送について、当てはまる行の先頭に yes, 当てはまらない 行の先頭に no と記述しなさい。
(a) coins 以外に電子メールのアカウントがある。 (b) coins のメールを毎日読む。 (c) ~/.forward の機能を理解した。 (d) ~/.forward を設定した。
(5) coinsに届いたメールを毎日確認する方法を書きなさい。
(6) ls -l (ls -ld) を使って、次のファイルのモードを調べなさい。そして、 どのようなユーザやグループがどのようにアクセスできるかを説明しなさい。
(7) The Unix Super Text の次の部分を読みなさい。
(8) The Unix Super Text の次の部分を読みなさい。