プロセス、アクセス制御、電子メールの転送、Emacs(5)

					2010年05月11日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報工学研究科 
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2010/2010-05-11
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

■プロセス

説明するのは、けっこう難しい。完全な理解には、次のような勉強が必要にな る。

◆プロセスとは

プログラムがメモリに読み込まれ、CPU (processor) により実行できる状態に なったもの。 ←→プログラムは、ディスクにあってもプログラム。

「端末」を複数開くと、「シェル」のプロセスが2つ。 プログラムとしては、同じ bash だが、プロセスとしては別物になる。

その昔は、1度に1個のプログラムだけしかメモリに入れられなかった。 (プログラムとプロセスの違いが希薄。)

メモリにプロセスが3つ、UNIXカーネル、ハードディスク、CPU

プログラムとプロセス

◆プロセスの役割

保護の単位
(故意か過失かを問わず) 特に許可を出さない限りプロセスは他のプロセスの 影響(データ見る、データを破壊する、強制終了させる) を受けないようになっている。 あるプロセスの動作がおかしくなっても、 コンピュータ全体としては動作しつづける。
資源割当ての単位
メモリ、ディスク、プリンタ、ディスプレイ、キーボードなどコンピュータが 処理を進める上で利用価値のあるものを総称して 資源(resource) という。 複数のプロセスを動作させる時、資源が不足してきたら、ある基準で分配する。

プロセスの操作

「殺す」と「止める」は違う。 殺したプロセスは、再開できない。 止めたプロセスは、場合によっては、再開できる。

■プロセスを作る==プログラムを実行する

プログラムを実行すると、プロセスが作られる。 例:
$ ls [←]

■プロセスの観察

プロセスには、ID (identifier)と属性がある。 psコマンド は、プロセスの一覧と属性を表示するコマンドである。
$ ps [←]
  PID   TT  STAT      TIME COMMAND
  639 s000  S      0:00.01 -bash
  652 s000  S+     0:00.20 emacs
  646 s001  S      0:00.01 -bash
$ []
1行が1プロセスに対応。左から次のような意味を持つ。
PID プロセス識別子
プロセスを区別する番号。 最大5桁の番号。
TT 端末名
そのプロセスが結びつけられている端末の省略形。 たとえば、端末 /dev/ttys001s001になる。
STAT 状態
プロセスの 状態 (STATe)。 次のようなものがある。

R (runnable)
実行可能。CPU が空いていれば実行される。
U (uninterruptible), D (Disk),
ディスク入出力などの完了を待っている。割り込み不可。
S (Sleep)、I (Idle)
キーボードや他のプロセスからの入力を待っている。
Z (Zombie)
既に終了していて、終了処理の完了を待ってる。
T (Traced)
一時的に停止しているか、デバッグの対象になっている。
TIME
CPU時間。 CPUがそのプロセスを実行するために費やした時間。
COMMAND
そのプロセスを起動した時のコマンド。 プログラムが含まれているファイルの名前の一部。

◆プロセスと端末

プロセスは、端末に関連して次のように分類される ps コマンドに x オプションを指定すると、端末と結びついていないプロセス も表示する。
$ ps x [←]
  PID   TT  STAT      TIME COMMAND
  526   ??  Ss     0:00.06 /sbin/launchd
  547   ??  S      0:00.26 /System/Library/CoreServices/Dock.app/Contents/MacOS
  548   ??  S      0:00.31 /System/Library/CoreServices/SystemUIServer.app/Cont
  549   ??  S      0:00.62 /System/Library/CoreServices/Finder.app/Contents/Mac
  553   ??  S      0:01.33 /System/Library/Frameworks/ApplicationServices.frame
  556   ??  S      0:00.00 /usr/sbin/pboard
  560   ??  S      0:00.01 /System/Library/Frameworks/InputMethodKit.framework/
  561   ??  S      0:00.35 /System/Library/Input Methods/Kotoeri.app/Contents/M
  564   ??  S      0:00.17 /usr/libexec/UserEventAgent -l Aqua
  578   ??  S      0:00.04 /System/Library/CoreServices/Menu Extras/TextInput.m
  580   ??  S      0:00.01 /System/Library/CoreServices/CCacheServer.app/Conten
  604   ??  S      0:00.09 /System/Library/Frameworks/OpenGL.framework/Versions
  606   ??  S      0:09.23 /Applications/iTerm.app/Contents/MacOS/iTerm -psn_0_
  616   ??  S      0:02.03 /Applications/Firefox.app/Contents/MacOS/firefox-bin
  638 s000  Ss     0:00.01 login -fp yas
  639 s000  S      0:00.01 -bash
  652 s000  S+     0:00.21 emacs
  645 s001  Ss     0:00.01 login -fp yas
  646 s001  S      0:00.01 -bash
  659 s001  R+     0:00.00 ps x
$ []

◆プロセスとユーザ

プロセスには、どのユーザの資格で実行しているかという情報( UID, User Identifier )が設定されている。この資格は、通常はそのプロセスを起動した ユーザになる。psコマンドを引数なしに実行すると、自分の資格で実行してい る(端末がある)プロセスだけを表示する。他人のプロセスも表示したい時は、 psコマンドを実行するときに「a」オプションをつける。
$ ps a [←]

◆プロセスと資源

psコマンドにuオプションを付けると、 プロセスに割り当てられたメモリ資源やCPU資源が表示する。
$ ps u [←]
USER   PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
yas    652   0.0  0.3  2451208  13168 s000  S+    5:58PM   0:00.21 emacs
yas    646   0.0  0.0  2435468   1008 s001  S     5:58PM   0:00.01 -bash
yas    639   0.0  0.0  2435468   1008 s000  S     5:58PM   0:00.01 -bash
$ []
%CPU
過去1分間に利用した CPU 時間の割合。
%MEM
実際に消費してるメイン・メモリの大きさの割合。
VSZ (Virtual Size)
仮想記憶上のプロセスの大きさ。KB 単位。
RSS (resident set size)
実際に消費してるメイン・メモリの大きさ。
STARTED
プロセスが生成された時刻。

◆プロセスの親子関係

プロセスがある命令(システム・コール)を実行すると新しくプロセスが 生成される。 プロセスにはそのプロセスの生みの親が1個ある。 もとのプロセスを「親プロセス」とう。

親子関係により、プロセスは全体として木構造を作る。

親プロセスのプロセス識別子は、psコマンドに「l」オプションをつけると PPIDのところに表示される。

$ ps l [←]
  UID   PID  PPID CPU PRI NI      VSZ    RSS WCHAN  STAT   TT       TIME COMMAND
 1013   639   638   0  31  0  2435468   1008 -      S    s000    0:00.01 -bash
 1013   652   639   0  31  0  2451208  13168 -      S+   s000    0:00.21 emacs
 1013   646   645   0  31  0  2435468   1008 -      S    s001    0:00.02 -bash
$ []
PID 652 の emacs の親プロセスは、PID 639 の bash。

■プロセスを殺す(kill)

プロセスが自主的に終了しない時に、強制的に終了させること。

Unix では、プロセスを殺す方法は、主に次の2つ。

どちらの方法でも、裏では シグナル (ソフトウェア割込み) という仕掛けが働く。

◆キーによるプロセスの強制終了

端末で動作しているプロセスが、キーボードからキーを読み込んでいる状態の 時には、^C (Control + C) を押すと、終了できる。以下は、 cat コマンドのプロセスを^Cで強制終了している。
$ 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 38400 baud; 35 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 -iutf8
        -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 = ; dsusp = ^Y; eof = ^D; eol = ;
        eol2 = ; erase = ^?; intr = ^C; kill = ^U;
        lnext = ; min = 1; quit = ^\; reprint = ^R; start = ^Q;
        status = ; stop = ^S; susp = ^Z; time = 0; werase = ^W;
$ []
「intr」のところに表示されるものが「^C」, 「quit」のところに表示されるものが「^\」に相当するキー。 「kill」は、1行削除の意味。

◆kill コマンドによるプロセスの強制終了

^C^\ で死なないプロセス (lv, emacs など) を殺すには、kill コマンドを使う。
$ kill pid [←]
これは、プロセス識別子pidのプロセスを殺す。 他人のプロセスは、権限がないので殺せない。

注意:pid には、プロセス識別子となる番号を入れる。「p」、 「i」「d」と3文字打つのではない。

◆kill -KILL

単純な kill コマンドでは死なないプロセスの場合、 -KILLをつけてkillコマンドを実行する。
$ kill -KILL pid [←]

■アクセス制御

アクセス制御(access control) とは、「主体」が、「オブジェクト」を「操作」する時、どんな操作なら正し いということを定義して、それがきちんと守られていることをということを保 証することである。

図? アクセス制御における主体、オブジェクト、および、操作

図? アクセス制御における主体、オブジェクト、および、操作

Unixでは、アクセス制御の主体は、プロセスである。 アクセス制御のオブジェクトは、ファイル、または、プロセスである。 操作には、次のようなものがある。

◆ユーザとグループ

Unix (MacOSX, Linux含む), Windows NT/2000/XP では、ユーザ(個人)とグルー プを識別したアクセス制御を行うことができる。 オペレーティング・システムごとに、ユーザやそのグループの考え方は、基本 的には似ているが、細かい所で異なる。

図? 実世界のユーザとUNIX中のプロセス・ファイル

図? 実世界のユーザとUNIX中のプロセス・ファイル

◆ユーザ

ユーザ(user, 利用者)とは、Unixの外では、個人(人間)。 Unixの内部では、次のどれかで表現する。
ユーザ名(user name)
文字列
UID(user ID, user identifier)
16ビット-32ビットの整数

Unixでは、全てのファイルやプロセスは、あるユーザの所有物である。 ファイルとプロセスには、UID が付加されている。

◆グループ

グループ(group)とは、Unixの外の世界では、計算機を使う人間の集合。 Unixの内部では、次のどれかで表現する。
グループ名(group name)
文字列
UID(user ID, user identifier)
16ビット-32ビットの整数

1人のユーザが複数のグループに属することができる。

◆ファイルの属性

ファイルは、属性(ls -l で表示)として、UID と GID を1つずつ持つ。 ファイルの所有者となる個人は、1人。 ファイルが属するグループも1つ。

◆プロセスの属性

プロセスは、UID (1個) と GID を複数個持つ。

◆プロセスのユーザ名とグループ名を調べる

プロセスの所有者のユーザ名を表示するには whoamiコマンドを用いる。
$ whoami [←]
yas
$ []
この例では、この人(のプロセス)のユーザ名は、yas

プロセスが属しているグループのグループ名を調べるには、 groupsコマンドを用いる。

$ groups [←]
ugrad _developer netaccounts everyone com.apple.sharepoint.group.1
$ []
この例では、この人(のプロセス)は、 ugrad, _developer, netaccounts everyone, com.apple.sharepoint.group.1, という5つ のグループに属している。

idコマンドも使える。

$ id [←]
uid=1013(yas) gid=530(ugrad) groups=530(ugrad),204(_developer),62(netaccounts),12(everyone),402(com.apple.sharepoint.group.1)
$ []

◆ファイルの UID・GID 属性を調べる

ファイルの UID 属性(所有者属性)と GID 属性を調べるには、 ls -l (ファイルの場合), ls -ld (ディレクトリの場合) を用いる。
$ ls -l ~/.bashrc [←]
-rw-r--r--  1 yas  prof  183  3  4 15:47 /home/prof/yas/.bashrc
$ ls -ld ~ [←]
drwxr-xr-x  53 yas  prof  12288  5 10 17:55 /home/prof/yas
$ []
この例では、UID 属性が yas、GID 属性が prof である。

◆ファイルに対するアクセス制御

Unixでは、ファイルの「内容」のアクセス制御を次の3段階で行う。
ユーザ
ファイルのUID(所有者)が、プロセスのUIDと同じ
グループ
ファイルのGIDが、プロセスのGIDのリストのどれかと同じ
その他
上の2つに当てはまらない時
これをつかって、モード属性の下位9ビットのうち、どの3ビットを使うかを 決める。そして、そのビットが1になっていれば、その操作が許される。

ファイルの「内容」のアクセス3段階であるが、ファイルの「属性」次の2段 階である。

ユーザ
ファイルのUID(所有者)が、プロセスのUIDと同じ
それ以外
ファイルのUID(所有者)が、プロセスのUIDと異なる
ユーザの権限では、ファイルの属性(モード、グループ、時刻)を変更する ことができる。それ以外の権 限では、属性を読み出すことはできるが、変更は一切できない。 つまり、ファイルの内容がアクセスできなくても、ls -l で 属性を調べることはできる。

◆ディレクトリのx

ディレクトリのモードで x は、そのディレクトリの内容を検索できることを意 味する。ディレクトリの x を落すことで、それ以下の部分木全体のアクセスを 禁止することができる。

◆プロセスに対するアクセス制御

プロセスのアクセス制御は、次の2段階で行なう。
同一ユーザ
操作対象のプロセスが、操作するプロセスのUIDと一致している。
それ以外
操作対象のプロセスが、操作するプロセスのUIDと一致していない。
プロセスの操作としては、シグナルを送ることができるかどうか (kill() システムコール) と、デバッガで デバッグすることができるとか(ptrace() システムコール)、トレースを調べることができるかなどが ある。それらの操作は、同一ユーザの場合 許され、そうではない場合は、許されない。

◆スーパー・ユーザ

どのようなアクセスも可能な無敵のユーザ。

スーパー・ユーザ(super user) は、UID が 0 。 特権ユーザ(privileged user)ルート(root)su (su コマンド、あるいは super user の略)ともよばれる。 スーパーユーザのユーザ名は、慣例として root という文字列が使われる。

ファイルのバックアップなど、システム管理の作業には スーパー・ユーザの仕組みが必要になる。

ファイルの UID・GID 属性を変更する

ファイルの UID 属性(所有者属性)を変更するには、chown コマ ンドを用いる。ただし、スーパーユーザの権限が必要である。

ファイルをコピーして、元ファイルを消すことはできる。

ファイルの GID 属性を変更するには、chgrp コマンドを使う。 一般ユーザは、自分が属しているグループにのみ変更できる。 任意のグループに変更するには、スーパー・ユーザの権限が必要である。

◆ユーザ名とUID、グループ名とGIDの対応、属性の伝播

■ファイルのモードの変更

◆chmod コマンド

chmodコマンドは、ファイルのモード属性を変更するためのコマンド。
$ ls -l file1.txt  [←]
-rw-r--r--  1 yas  prof  2  5 10 18:59 file1.txt
$ chmod go-r file1.txt  [←]
$ ls -l file1.txt  [←]
-rw-------  1 yas  prof  2  5 10 18:59 file1.txt
$ []
file1に対して、グループ(g)とそれ以外の人(o)に対して「読込み可」の許可を 取り除いている。

chmodは一般的には次の形式で実行する。

$ chmod set file1 file2 ... [←]
set の形式
[ugoa][=+-][rwx]
ここの[ugoa]は、誰に対するアクセスの設定を変更するかを対象となる人を以 下の表から選んで並べる(複数可)。
文字 単語 意味
u user ユーザ(利用者,所有者)
g group グループ
o others その他
a all 全員、ugo と同じ
[=+-]の意味
文字 意味
+ 許可を追加する
- 許可を除く
= 指定した許可だけとする
[rwxXst]の部分には次のような指定が可能。
文字 単語 意味
r read 読込み可
w write 書込み可
x execute 実行可
X execute 実行可(所有者に対して「実行可」がある時だけ)
setには[ugoa][=+-][rwx]の指定を「u=rw,og=r」のように「,」で区 切って複数並べることもできる。

chmod には、-R (recursive)オプションがある。 これは、ディレクトリをたぐり全部変更することを意味する。

◆モードの実例

rw-r--r--
誰かでも読めるファイル
rwxr-xr-x
誰かでも読めるアクセスできるディレクトリ。 xもたてる。 (たてる==ビットを1にする。)
rwxr-xr-x
実行可能ファイル
rwx------
MH や Mew を使っている場合は、~/Mail ディレクトリのモード
rw-r--r--
WWWページ用のファイル (~/public_html以下のファイル)
rwxr-xr-x
WWWページ用のディレクトリ (public_html以下のディレクトリ)
rwxr-xr-x または rwx--x--x
WWWページを作成する時のホーム・ディレクトリ (~~/public_html の親ディレクトリ)。 x ビットを出す。
rw-rw-r-- または rwxrwxr-x
グループで共同作業するような時には、グループに属する人には書き込みを許す。
r-xr-xr-x, r-x------
読み込み専用のディレクトリ。 その下のファイルを削除することができない。
注意:WWWページを作成する時には、ホーム・ディレクトリのモードにも注意す る。ホーム・ディレクトリが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 はプロセス識別子。 ;

■電子メール

who@coins.tsukuba.ac.jp に届いた電子メールは、毎日、読むこと。特に、コ ンピュータ・リテラシの授業の最中は必ず読むこと。

TAや教官からメールが来て、必要な返事は、次の実習時間/講義時間までに 出すこと。

coins 以外のメール・サーバを主に使うときには、~/.forward による転送の設 定を行うこと。

■~/.forwardによる電子メールの転送

メール・リーダには、 受け取ったメールをユーザの操作で1つひとつ 転送(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 にも送られる。

~/.forwardにおけるループの危険性

複数のメール・アドレスがある人は、どのホストにログインした時にも、全部 のホストに届いた電子メールが読める状態にしたいと思うかもしれない。 上の例では、 alps にログインした時にも、 alpshimalaya の両方のメールが読め、 また、himalaya にログインしてもやはり alpshimalaya の両方のメールが読める と便利に思えるかもしれない。しかし、こうすることは技術的に難しいので、 しばらくはあきらめて欲しい。

\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 にメールが届いた 場合、次のようなことが起る。
  1. alps にコピーが残され、かつ、 shiro@himalaya.is.tsukuba.ac.jp に送らる。
  2. himalaya では、やはり、コピーが残され(ここまでは順調)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる(!)。
  3. alps では、コピーが残され(2回目)、himalaya に送られる。
  4. himalaya では、コピーが残され(2回目)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
  5. alps では、コピーが残され(3回目)、himalaya に送られる。
  6. himalaya では、コピーが残され(3回目)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
  7. alps では、コピーが残され(4回目)、himalaya に送られる。
  8. himalaya では、コピーが残され(4回目)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
  9. ...
このような電子メールのピンポンが、永遠に続く。実際には、電子メールの転 送には上限が設定されているので、その上限に達した段階でエラーになって止 る。

3ヵ所以上でこの設定をしたとすると、中継される度にメールが増殖する。

\loginname の機能を使っていなかったとすると、コピーは 残らないが、メールが行き来するだけで、どこにも届けられずにエラーになる。

~/.forward の設定をしたら、必ず自分で自分あてに電子メールを出 して届くかテストすること。~/.forward の設定を間違えると、エラー のメールも届かなくなるので、エラーが起こっていることさえわからなくなる。

~/.forward の機能は、もともとは、sendmail という種類のMTA の機 能である。他の MTA (qmail, postfix)でも使えるように設定していることが多い。

◆電子メールをプログラムに転送する

~/.forward の応用として、他のアドレスに電子メールを転送するの ではなく、(サーバ上で実行される)プログラムに転送する機能がある。すな わち、(サーバ上で)プログラムを実行して標準入力に電子メールの内容を与 えるという機能がある。これには、次のように~/.forwardに書く。
"| /program/path/name arg1 arg2 arg3 ... argn" 
このように、| に続いて、プログラムのパス名と引数を書き、 全体を "" で括る。

この機能を使って、受け取った電子メールを自動的に分類したり、 spamメール を排除したりすることができる。たとえば、MH の slocalやprocmail と呼ば れているプログラムがこの機能を使っている。

■Emacs(5)

◆set-buffer-file-coding-system

Emacs は、日本語を含めて様々な言語を扱うことができる。 日本語を扱う時には、次のような文字コードを使うことができる。 auto-save のファイルで、ファイル名が「`#'ファイル 名`#'」のようになっているものは、emacs-mule-unix になっている。この 文字コードのままレポートとして投稿するなど、Emacs 以外のプログラムに渡 してはならない。他のプログラムに渡す時には、EUC-JP など、他のプログラム でも解釈できる標準のコードにしなさい。

ファイルに保存する時の文字コードを変更するには、次の機能を使う。

M-x set-buffer-file-coding-system [←]

◆universal-coding-system-argument

Emacs は既存のテキストファイルを開く時に文字コードの自動判定を行う。こ の判定は、強力ではあるが、時々判定に失敗する。その時には、文字コードを 指定しながファイルを開く方法がある。
M-x universal-coding-system-argument [←]
以後、文字コードを指定し、C-x C-f の操作を行う。

■実習

実習時間中には、 以下の課題をできるだけ多く行いなさい。全部を行う必要はない。

★練習問題(801) psコマンド

ps コマンドを使って、プロセスの一覧を表示しなさい。
$ ps [←]

★練習問題(802) psコマンドのオプション

ps コマンドには、様々なオプションを与えることができる。 以下は、-l オプションをを与えたものである。
$ ps -l [←]
ps コマンドに、次のオプションを与えて、動作を確認しなさい。
a
all。他人のプロセスも含めて全てのプロセス。
l
long。長い表示。
u
長い表示。
U user (大文字)
ユーザ名 user のプロセスだけ
x
端末無しのプロセスの表示
ux
u と x の組み合わせ
BSD 系の ps (MacOSX, Linux含む) では、オプションの「-」を省略できる。た とえば、次の2つは、同じ意味である。このことを確かめなさい。
$ ps l [←]
$ ps -l [←]

他のオプションについて、man ps を見て見なさい。

★練習問題(803) psコマンドとlvコマンド

ps コマンドに a オプションを付ける等して、プロセス数が多くなると画面に 入り切らなくなる。この時には、lv コマンドと組み合わせるとよい。
$ ps aux | lv [←]
この方法を、確かめなさい。lv コマンドについては、 手引き 2.2.12 参照練習問題(312) lvコマンド を参照しなさい。q(終了)、次のページへの移動(スペースキー)、 ページを戻る(b)は、必ず覚えなさい。

★練習問題(804) psコマンドで横長の表示

ps ux や ps aux では、MacOSX 関連のプロセスの表示が切れてしまう。 w コマンドを使ってより多くの情報を表示さててみなさい。
$ ps aux [←]
$ ps auxw [←]
あるいは、iTerm の画面を横幅を広げて ps コマンドを打ちなさい。 横幅を広げるには、右下の斜線が入っている部分をドラッグすればよい。

★練習問題(805) topコマンド

top コマンドで、「重たい」プロセスを表示しなさい。 「重たい」プロセスとは、CPU時間を大量に消費しているプロセスや メモリを大量に消費しているプロセスのことである。 終了するには、小文字の q を打つ。^C でもよい。
$ top [←]
$ top -o cpu [←]
(CPU を消費している順)
MacOSX では、top コマンド自分自身が「重たい」と認識される。 その場合は、top コマンドが表示を変更する頻度を下げる。
$ top -s 4 -o cpu [←]
man top でマニュアルを表示して、-o オプションと -U の使い方を 調べなさい。そして、メモリの利用順 (rsize) で表示しなさい。 -U オプションで自分自身のプロセスだけを表示しなさい。
$ top -U $USER [←]

★練習問題(806) pstreeコマンド

pstreeコマンドを実行しなさい。それでプロセスの親子関係により木構造が作 られていることを確認しなさい。
$ pstree [←]
$ pstree | lv [←]
iTerm の画面の横幅を広げると見やすい。

★練習問題(807) 「アクティビティモニタ.app」の利用

「ユーティリティ(/Applications/Utilities/)」にある 「アクティビティモニタ.app(Activity Monitor.app)」 を動作させ、プロセスの一覧を表示させなさい。
$ open "/Applications/Utilities/Activity Monitor.app" [←]
または、Finder で、「移動」メニューから「ユーティリティ」を 選択。「アクティビティモニタ.app」のアイコンをダブルクリック。

アクティビティモニタの表示

アクティビティモニタの表示

表示されるプロセスの範囲を変えてみなさい。

top コマンドの表示と比較しなさい。

★練習問題(808) ^Cによる強制終了

^C (Control+C) によるプロセスの強制終了を行いなさい。
$ cat [←]
aaa[←]
aaa
bbb[←]
bbb
^C
$ []
なお、^C と 入力の終わりを意味する ^D は働きが異な る。どちらでもプロセスが終了することがあるが、強制終了したい場合には、 ^C を使いなさい。

★練習問題(809) ^Cによる強制終了(2)

次のような終了するのに時間がかかるプログラムを実行してしまって、途中で やめたくなった時に ^C で終了するように練習しなさい。
$ ls -R ~/Library [←]
(大量の表示、省略)
^C
$ []

★練習問題(810) ^Cが効かないプログラム

端末 (iTerm) の中で実行されるプログラムのうち、次のようなプログラムは、 ^C でも終了しない。このことを確認しなさい。 注意: C-c は、C-x と同じように、2ストローク以上で1つの意 味をなすことが多い。何もない状態でC-c を打った場合には、 C-g によりキャンセルしなさい。

★練習問題(811) killコマンド

kill コマンドを使って、プロセスを殺してみなさい。たとえば、端末を2個表 示し、片方の端末で、lv コマンドでファイルを表示しなさい。もう片方の端末 で、ps コマンドで PID を調べ、kill コマンドで殺しなさい。

★練習問題(812) killコマンドで他人のプロセスを殺そうとしてみる

ps コマンドで調べたプロセスのうち、他人のプロセス(root、その他) を kill コマンドで殺そうとしてみなさい。何がおきるかを観察しなさい。どのよ うなエラーが生じるか。

★練習問題(813) ps コマンドと grep コマンド

ps コマンドで大量の表示の中から特定のプログラムを見つけたい時には、 grep コマンドと組み合わせて用いると便利である。次の例は、cat コマンドか らなるプロセスを探している。
$ ps ux | grep cat [←]
$ ps uxw | grep cat [←]
この機能を利用して見なさい。 次のようにして、Finder や Dock のプロセスの PID を調べなさい。
$ ps uxw | grep Finder [←]
$ ps uxw | grep -i finder [←]
$ ps uxw | grep Dock [←]
$ ps uxw | grep -i dock [←]
grep コマンドに -i オプションを付けると大文字と小文字を関係なく調べるこ とができる。

★練習問題(814) ps | grep、kill

次の一連の操作を行いなさい。
$ ps uxw | grep cat [←]
$ kill  [←]

★練習問題(815) MacOSX Command+Option+Esc

MacOSX で、Command+Option+Esc キーを押すと 「アプリケーションの強制終了」のウインドウを表示できる。

(まず、Commandキー(Command) と Option キーを左手で押し、 押しっぱなしの状態で、右手で Esc キーを一度押して離す。)

Command+Option+Escキー

「アプリケーションの強制終了」のウインドウ

この機能を確認しなさい。なお、この機能では、ウインドウを開くプロセスし か強制終了できない。iTerm の中で実行されるプロセスや端末とは結びついて いないプロセスを強制終了するには、kill コマンドを使うしかない。

★練習問題(816) whoami,groups,idコマンド

whoami, groups, idコマンドを使って、プロセス(シェル)のUID, GID, groups 属性を表示しなさい。
$ id [←]
$ whoami [←]
$ groups [←]

★練習問題(817) chmod コマンド

chmod コマンドで、ファイルやディレクトリのモードを変更しなさい。 以下の例は、file1に対して、グループ(g)とそれ以外の人(o)に対して「読込み 可」の許可を取り除いている。
$ ls -l file1.txt  [←]
-rw-r--r--  1 yas  prof  2  5 10 18:59 file1.txt
$ chmod go-r file1.txt  [←]
$ ls -l file1.txt  [←]
-rw-------  1 yas  prof  2  5 10 18:59 file1.txt
$ []
go-r を含めて、様々なモードの設定方法がある。 次の設定方法の意味を確認しなさい。

★練習問題(818) .forwardの設定

coins 以外に日常的に読み書きするメール・アカウントがある 人は、毎日 coins に届いたメールを確認する方法として ~/.forward を設定して、転送する方法が考えられる。 そのようにしたい人は、そうしなさい。 設定が完了したら、必ずテストして、うまく動いていることを 確認しなさい。 メールがループしないことを確かめなさい。

★練習問題(819) ^Zキーからの復帰

端末の中で、キー Key(^Z) (Control + Z) は、プロセスを 一時的に止めるためのキーである。 詳しくは、The Unix Super Text 第22章 参照。 この機能は使わなくても良いが、不意に Key(^Z) を押した時に元の状態に戻す ことは必要である。次の方法で、元に戻ることを確認しなさい。 注意:Emacs を終了するために、^Z (C-z) を使ってはなら ない。

★練習問題(820) Firefoxのプロファイル

Firefox には、様々な設定(たとえばブックマークや最初に表示されるページ) を「プロファイル」と呼ばれるものに個別に保存することができる。この機能 を利用してみなさい。

coins では、コマンドラインから次のように打つと、 ProfileManager という機能が働く。

$ firefox-profilemanager  [←]
この画面で、プロファイルの作成、削除、指定しなかった時に使われるプロファ イルを指定することができる。(プロファイルが複数ある場合、1個目の Firefox のプロセスを実行する時にoption キーを押しながら実行すると、この 機能が働く。)

複数のプロファイルを用いればね複数の Firefox のプロセスを同時に実行する ことができる。Firefox は、もともと1つのプロセスで複数のウインドウを開 くこともできる。この2つの機能の違いと有効な利用方法を考えなさい。

★練習問題(821) Emacs M-x set-buffer-file-coding-system

EmacsのM-x set-buffer-file-coding-system を使って、ファイルの文字コードを変更することができる。 このことを確認しなさい。

★練習問題(822) Emacs universal-coding-system-argument

Emacs は既存のテキストファイルを開く時に文字コードの自動判定を行う。こ の判定は、強力ではあるが、時々判定に失敗する。その時には、文字コードを 指定しながファイルを開くとよい。この機能を使ってみなさい。

Emacs で文字コードを指定しながらファイルを開くには、次のようにする。

  • 次のように打つ。
    M-x universal-coding-system-argument [←]
    M-x は、Esc x でもよい。
  • すると、ミニバッファに次のような表示がなされる。
    Coding system for following command (default, xxx): 
  • このプロンプトに対して文字コードを指定する。 以下の例では、euc-jp-unix を指定している。
    Coding system for following command (default, xxx): euc-jp-unix[←]
  • 続いて C-x C-f (find-file) を実行する。

    ★練習問題(823) Emacs fill-paragraph (Esc q, M-q)

    Emacs には、1行の長さをそろえる機能がある。たとえば、次のように乱れたものを
    M-q runs the command fill-paragraph 
    which is an interactive compiled
    Lisp
    function
    in `textmodes/fill'.
    It is bound to M-q.
    
    M-q または Esc q で、標準で 70 以内になるように次のように整える。
    M-q runs the command fill-paragraph which is an interactive compiled
    Lisp function in `textmodes/fill'.  It is bound to M-q.
    
    整える範囲は、上下に空行で区切られた範囲である。長過ぎる行は、改行が入 れられる。英単語の場合には、途中で改行することはない。日本語の場合には、 標準では、35文字で改行される。

    この機能を確認しなさい。

    ★練習問題(824) Emacs set-fill-column

    fill-paragraph で、折り返す文字数を変えたい場合には、set-fill-column を 使う。
    C-u  C-x f
    
    あるいは、折り返したい位置にカーソルを移動してから次のように打つ。
    C-x f
    
    以後、M-q または Esc q で折り返しを行った時には、指定 した文字数で折り返される。この機能を確認しなさい。

    ★練習問題(825) ps -lによる親子関係

    ps -l や pstree コマンドを使えば、プロセスの親子関係を調べることができ る。親子関係は、全体としては、木構造になっている。そのことを調べなさい。

    全てのプロセスの親プロセスは、PID 1 プロセスになっている(根に相当)。

    ★練習問題(826) 8進数を利用したchmodコマンド

    chmod コマンドは、モードを8進数で与えることもできる。 このことを man で確認しなさい。また、利用してみなさい。 8進数で指定することの利点を考えなさい。

    ★練習問題(827) chgrp コマンド

    chgrp コマンドで、ファイルやディレクトリのGID属性を変更しなさい。
    $ ls -l file1.txt [←]
    (ファイルのグループの表示)
    $ id [←]
    (自分(プロセス)が属しているグループの表示)
    $ chgrp グループ file1.txt [←]
    $ ls -l file1.txt [←]
    (ファイルのグループの表示)
    $ []
    

    ★練習問題(828) lsofコマンド

    lsof コマンド(list open files) は、プロセスの一覧と同時に、プロセスがど のファイルを開いているかを表示するコマンドである。これを実行してみなさ い。

    ★練習問題(829) ディレクトリのGIDの伝播

    UIDとGIDの伝播を確認しなさい。 /tmp など、誰でも書き込みできる場所にファイルを作成すると、その ファイルの UID 属性はどうなるか調べなさい。新たに実験用のディレクトリを mkdir コマンドで作成しなさい。そのディレクトリのGID属性を chgrp で変更 し、その中に新たなファイルやディレクトリを作成したら、その GID がどう設 定されるかを確かめなさい。また、既存のファイルをmv コマンドで移動したら どうなるかを調べなさい。

    ■課題8 プロセス、アクセス制御、電子メールの転送、Emacs(5)

    以下の問題について、問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。端末の表示 (コマンドの実行結果)は、コピー&ペースト等の機能を使って提出するファイ ルに含めなさい。課題が達成されたことを示す程度には見やすいように編集し なさい。ただし、過度の編集は避けなさい。編集した部分は必要に応じて省略 記号を入れなさい。

    テキスト・ファイルで、右揃えをするには、パラグラフの区切りを、空行にし た上で、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 の次の部分を読みなさい。

    そして、項目についてついて調べて、簡単に説明しなさい。 (9) [加点] chmod 等の Unix のコマンドを利用して次のようなファイルやディ レクトリを作成し、それが動作していることを ls -l や rm コマンドなどで示 しなさい。 (10) [加点] The Unix Super Text の次の部分を読みなさい。 そして、フリーソフトウェアの発展におけるGPL の果たした役割について、 5-10行でまとめなさい(1行は、ASCII で60文字-80文字、漢字で35文字-40文字)。

    (11) [加点] The Unix Super Text の次の部分を読みなさい。 そして、以下の項目について何らかのコマンドを実行して、動作を確認しなさ い。レポートには、端末でのコマンドの実行結果を付けなさい。


    Last updated: 2010/06/17 16:48:47
    Yasushi Shinjo / <yas@is.tsukuba.ac.jp>