プロセス、シェル標準入出力、Emacs insert-file、Emacs fill-paragraph

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

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2014/2014-05-02
あるいは、次のページから手繰っていくこともできます。
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 [←]

■プロセスの観察

手引き 2.9.1 参照The Unix Super Text 第10章 参照

プロセスには、ID (identifier)と属性がある。 psコマンド は、プロセスの一覧と属性を表示するコマンドである。

$ ps [←]
  PID TTY           TIME CMD
  912 ttys000    0:00.03 -bash
  947 ttys001    0:00.02 -bash
  988 ttys001    0:00.04 ssh www.coins.tsukuba.ac.jp
 1027 ttys002    0:00.01 -bash
 1070 ttys002    0:00.09 /Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
$ []
1行が1プロセスに対応。左から次のような意味を持つ。
PID プロセス識別子
プロセスを区別する番号。 最大5桁の番号。
TTY, (TT) 端末名
そのプロセスが結びつけられている端末の省略形。 たとえば、端末 /dev/ttys000ttys000になる。
TIME
CPU時間。 CPUがそのプロセスを実行するために費やした時間。
COMMAND
そのプロセスを起動した時のコマンド。 プログラムが含まれているファイルの名前の一部。

◆プロセスと端末

プロセスは、端末に関連して次のように分類される ps コマンドに x オプションを指定すると、端末と結びついていないプロセス も表示する。
$ ps x [←]
  PID   TT  STAT      TIME COMMAND
  772   ??  Ss     0:00.14 /sbin/launchd
  794   ??  S      0:00.28 /usr/libexec/UserEventAgent (Aqua)
  795   ??  S      0:01.41 /usr/sbin/distnoted agent
  799   ??  S      0:00.30 /usr/sbin/cfprefsd agent
  803   ??  Ss     0:04.57 /usr/libexec/xpcd
  807   ??  S      0:00.04 /usr/sbin/pboard
  809   ??  S      0:00.13 /System/Library/PrivateFrameworks/CalendarAgent.fram
(中略)
 1014   ??  S      0:00.04 /System/Library/CoreServices/ScopedBookmarkAgent
 1064   ??  S      0:00.09 /System/Library/Frameworks/QuickLook.framework/Resou
 1065   ??  Ss     0:00.09 com.apple.quicklook.satellite
  911 s000  Ss     0:00.02 login -fp yas
  912 s000  S      0:00.03 -bash
 1122 s000  R+     0:00.00 ps x
  945 s001  Ss     0:00.01 login -fp yas
  947 s001  S      0:00.02 -bash
  988 s001  S+     0:00.07 ssh www.coins.tsukuba.ac.jp
 1024 s002  Ss     0:00.01 login -fp yas
 1027 s002  S      0:00.01 -bash
 1070 s002  S+     0:00.09 /Applications/MacPorts/Emacs.app/Contents/MacOS/Emac
$ []
ps に x, l, u, a 等のオプションを付けると、 ps はプロセスの 状態 (STATe) を表示する。状態には、次のようなものがある。
R (runnable)
実行可能。CPU が空いていれば実行される。
U (uninterruptible), D (Disk),
ディスク入出力などの完了を待っている。割り込み不可。
S (Sleep)、I (Idle)
キーボードや他のプロセスからの入力を待っている。
Z (Zombie)
既に終了していて、終了処理の完了を待ってる。
T (Traced)
一時的に停止しているか、デバッグの対象になっている。

◆プロセスとユーザ

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

◆プロセスと資源

psコマンドにuオプションを付けると、 プロセスに割り当てられたメモリ資源やCPU資源が表示する。
$ ps u [←]
USER   PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
yas   1070   0.0  0.1  2508388  17016 s002  S+    5:40PM   0:00.09 /Application
yas   1027   0.0  0.0  2452824   1312 s002  S     5:33PM   0:00.01 -bash
yas    988   0.0  0.0  2461144   2184 s001  S+    5:25PM   0:00.10 ssh www.coin
yas    947   0.0  0.0  2461016   1248 s001  S     5:25PM   0:00.02 -bash
yas    912   0.0  0.0  2452824   1332 s000  S     5:23PM   0:00.03 -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   912   911   0  31  0  2452824   1332 -      S    s000    0:00.04 -bash
 1013   947   945   0  31  0  2461016   1248 -      S    s001    0:00.02 -bash
 1013   988   947   0  31  0  2461144   2184 -      S+   s001    0:00.12 ssh ww
 1013  1027  1024   0  31  0  2452824   1312 -      S    s002    0:00.01 -bash
 1013  1070  1027   0  33  0  2508388  17016 -      S+   s002    0:00.09 /Appli
$ []
PID 988 の ssh の親プロセスは、PID 947 の bash。 PID 1070 の Emacs の親プロセスは、PID 1024 の bash。

◆幅広い表示

ps コマンドは、端末の横幅に合わせて表示する。 長い COMMAND が途中で切れてしまう。 表示を増やすには、次の方法がある。
$ ps u [←]
USER   PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
yas   1070   0.0  0.1  2508388  17016 s002  S+    5:40PM   0:00.09 /Application
yas   1027   0.0  0.0  2452824   1312 s002  S     5:33PM   0:00.01 -bash
yas    988   0.0  0.0  2461144   2184 s001  S+    5:25PM   0:00.19 ssh www.coin
yas    947   0.0  0.0  2461016   1248 s001  S     5:25PM   0:00.02 -bash
yas    912   0.0  0.0  2452824   1332 s000  S     5:23PM   0:00.04 -bash
$ ps uw [←]
USER   PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
yas   1070   0.0  0.1  2508388  17016 s002  S+    5:40PM   0:00.09 /Applications
/MacPorts/Emacs.app/Contents/MacOS/Emacs -nw
yas   1027   0.0  0.0  2452824   1312 s002  S     5:33PM   0:00.01 -bash
yas    988   0.0  0.0  2461144   2184 s001  S+    5:25PM   0:00.19 ssh www.coins
.tsukuba.ac.jp
yas    947   0.0  0.0  2461016   1248 s001  S     5:25PM   0:00.02 -bash
yas    912   0.0  0.0  2452824   1332 s000  S     5:23PM   0:00.04 -bash
$ []

■プロセスを殺す(kill)

手引き 2.9.2 参照The Unix Super Text 10.5節 参照

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

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; 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 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 = ^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行削除の意味。

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

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

注意:pid には、プロセス識別子となる番号を入れる。「p」、 「i」「d」と3文字打つのではない。たとえば、PID が 1023 のプロセスを殺す 時には、次のように打つ。

$ kill 1023 [←]

◆kill -KILL

単純な kill コマンドでは死なないプロセスの場合、 -KILLをつけてkillコマンドを実行する。
$ kill -KILL pid [←]
-KILL 以外にも、様々な種類がある。詳しくは、man kill を参照。

■プロセス関連のコマンドのまとめ

ps			プロセスの一覧の表示
ps ux			プロセスの一覧の表示(BSD,Linux)
ps aux			プロセスの一覧の表示(BSD,Linux)
stty all		端末の状態の表示(BSD)
stty -a			端末の状態の表示(System V,Linux)
kill PID		プロセスを殺す
kill -KILL PID		プロセスを殺す(必殺)
PID はプロセス識別子。 ;

■シェルと標準入出力

シェル(shell) は、次のようなプログラムである。 コマンド・インタプリタともいう。

◆プログラムの入出力

入力
プログラムが実行する時に受け取るデータ。 (引数、オプションに加えて)ファイルからも受け取れる。
出力
プログラムの実行結果
シェルの機能として、画面を出力をファイルに保存したり、キーボードの代わ りにファイルに保存されたデータを与えたりできる。

◆標準入出力

Unix では、文字端末で動くプログラムは次の3種類をあてにしている。
標準入力 (stdin, standard input, 0番)
普通、キーボードにつながっている。
標準出力 (stdout, standard output, 1番)
普通、画面につながっている。
標準エラー出力 (stderr, standard error output, 2番)
普通、画面につながっている。

キーボード、標準入力、プログラム、標準出力、標準エラー出力、画面

図? プログラムの標準入出力の普通の接続先

$ cat [←]
Line 1[←]
Line 1
Line 2[←]
Line 2
^D
$ []

◆標準入出力の切り替え(redirection リダイレクション)

シェルは、「記号>」 があると、標準出力を画面から指定されたファ イルに切り替えて、指定されたプログラムを実行する。
$ ls -l > file1 [←]

キーボード、標準入力、プログラム、標準出力、ファイル、標準エラー出力、画面

図? プログラムの標準出力のファイルへの切替え

シェルは、「記号<」 があると、標準入力をキーボードから指定され たファイルに切り替え、指定されたプログラムを実行する。
$ cat < file1 [←]

ファイル、標準入力、プログラム、標準出力、標準エラー出力、画面

図? プログラムの標準入力のファイルへの切替え

シェルは、「記号|」があると、次の動作を行う (パイプ(pipe)機能)。 例:
$ ls -l | head -4 [←]
total 99
drwx------   4 yas  prof   3072  4 10 17:37 Desktop
drwx------   3 yas  prof   1024  3 11 13:52 Documents
drwx------   2 yas  prof     80  3 10 18:16 Downloads
$ []
headコマンド は、ファイルや標準入力の先頭を表示する ためのコマンド。-n (nは数)というオプションが与 えられると、先頭の n 行だけ表示する。

ファイル、標準入力、プログラム、標準出力、パイプ、標準エラー出力、画面、パイプ、標準入力、次のプロセス

図? プログラムの標準出力のパイプへの切替え

ファイルを介しても類似の操作は可能だが、後で不要なファイルを消さなけれ ばならない。
$ ls -l | head -4 [←]
total 99
drwx------   4 yas  prof   3072  4 10 17:37 Desktop
drwx------   3 yas  prof   1024  3 11 13:52 Documents
drwx------   2 yas  prof     80  3 10 18:16 Downloads
$ ls -l > file [←]
$ head -4 < file [←]
total 99
drwx------   4 yas  prof   3072  4 10 17:37 Desktop
drwx------   3 yas  prof   1024  3 11 13:52 Documents
drwx------   2 yas  prof     80  3 10 18:16 Downloads
$ rm file [←]
$ []
パイプは、3つ以上のプログラム(プロセス)を結びつけることもできる。

◆標準エラーの役割

標準出力の切り替えを行ったとしても、標準エラーは画面に表示される。
$ ls Document > file [←]
ls: Document: No such file or directory
$ cat file [←]
$ []
Document」 は、「Documents」の打ち間違い(sがない)である。 ls コマンドは、エラー・メッセージを標準出力ではなく標準エラー出力に書き 出す。

2>file」をつかうと、標準エラー出力をファイルに保存 することもできる。

$ ls Document > file 2>file2 [←]
$ cat file [←]
$ cat file2 [←]
ls: Document: No such file or directory
$ []
2>&1」をつかうと、標準エラー出力(2)を、標準出力 (1)に混ぜて(&)、ファイルに保存することもできる。
$ ls Document > file 2>&1 [←]
$ cat file [←]
ls: Document: No such file or directory
$ []
2>&1」は、順番が大事。ファイルに混ぜて保存する場合 は、「>file」の後にやること。先にやると、その時点で の標準出力(画面)が指定されてしまう。
$ ls Document 2>&1 > file  [←]
ls: Document: No such file or directory
$ cat file [←]
$ []
2>&1を使うと、エラー・メッセージも含めてパイプに出力 することもできる。この場合は、パイプ|より左に書く。
$ ls Document 2>&1 | head -4 [←]
ls: Document: No such file or directory
$ []

◆ファイルの追記

標準出力では、ファイルを追加することができる。
>file
ファイルがなければ、まず空のファイルを作成する。ファイルがあれば、 file の内容を消して空にする。
>>file
ファイルが存在しても、消さずにその後ろに追加する。

■Emacs

◆insert-file

Emacs にはファイルを挿入する機能がある。

◆fill-paragraph

電子メールのテキストやレポートのテキストでは、1行を適当な長さで折り返す (右揃えをする)と都合が良い場合が多い。それには、Emacs の  fill-paragraph 機能が便利である。

例:実行前

A long long long long long long long long long long long long long long long line.
A short line.
A short line.
A short line.
A short line.
例: fill-paragraph 実行後
A long long long long long long long long long long long long long
long long line.  A short line.  A short line.  A short line.  A short
line.
fill-paragraph の使い方 fill-paragraph では、標準で英語なら1行を 70 文字、日本語なら 35 文字に する。この文字数を変更したい時には、次のようなキー操作を行なう。
C-u 数 C-x f

■実習

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

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

手引き 2.3.1 参照The Unix Super Text 第10章 参照

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

$ ps [←]

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

ps コマンドには、様々なオプションを与えることができる。 以下は、-l オプションをを与えたものである。
$ ps l [←]
ps コマンドに、次のオプションを与えて、動作を確認しなさい。
a
all。他人のプロセスも含めて全てのプロセス。
l
long。長い表示。
u
長い表示。
U user (大文字)
ユーザ名 user のプロセスだけ
x
端末無しのプロセスの表示
ux
u と x の組み合わせ
ps コマンドにオプションを与える方法として、「-」を付ける方法と付けない 方法がある。「-」の有無で表示が変わることがある。
$ ps l [←]
$ ps -l [←]
「-」の有無で、使い方が違うことがある。
$ ps u [←]
$ ps -u ログイン名 [←]

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

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

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

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

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

★練習問題(605) 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 自分のログイン名 [←]

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

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

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

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

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

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

表示されたら、「CPU」タブを表示しなさい。そして、 表示されるプロセスの順序を変えてみなさい。

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

★練習問題(608) 「アクティビティモニタ.app」によるメモリ利用

アクティビティモニタ.appを実行しなさい。 「CPU」タブではなく、「メモリ」タブを開きなさい。プロセスをメモリの使用 量の順に表示しなさい。

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

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

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

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

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

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

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

手引き 2.9.2 参照The Unix Super Text 10.5節 参照

kill コマンドを使って、プロセスを殺してみなさい。

  1. iTerm 等で、端末を2個つ表示し、それぞれシェルを実行する。
  2. 片方の端末で、lv コマンドでファイルを表示する。
    $ lv literacy-a4.txt [←]
    $ lv ~/.bashrc [←]
    
  3. もう片方の端末で、ps コマンドで lv コマンドから実行された プロセスの PID を調べる。
    $ ps [←]
    
  4. kill コマンドで lv コマンドから実行されたプロセスを殺す。
    $ kill PID [←]
    

lv コマンドの代わりに、bash からなるプロセスを殺すとどうなるか調べなさい。

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

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

★練習問題(614) grep

grep は、引数で指定されたファイル、または、標準入力を検索 し、引数で指定された文字列が存在する行だけを表示するプログラムである。 以下の例は、ファイル「/etc/passwd」の中にある「root」とい う文字を含む行を表示している。
$ grep root /etc/passwd  [←]
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
$ []
同じことを、パイプを使っても実行することができる。
$ cat /etc/passwd  | grep root [←]
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
$ []
grep コマンドを使って次のようなことを行ってみなさい。

grep コマンドには次のようなオプションを指定することができる。

-v
その行が含まれないものを表示する
-i
大文字小文字を無視する
この動きを確認しなさい。

★練習問題(615) 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 [←]
$ ps uxw | grep Emacs [←]
$ ps uxw | grep -i emacs [←]
grep コマンドに -i オプションを付けると大文字と小文字を関係なく調べるこ とができる。

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

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

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

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

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

Command+Option+Escキー

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

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

★練習問題(618) 標準出力の切り替え

次のように、cal コマンドを実行して、>による標準出力の切り替 えが動作することを確認しなさい。
$ cal 5 2014 [←]
      5月 2014
日 月 火 水 木 金 土
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

$ cal 5 2014 > cal-2014-05.txt [←]
(画面には何も表示されない)
$ cat cal-2014-05.txt [←]
      5月 2014
日 月 火 水 木 金 土
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

$ []

★練習問題(619) bcコマンド

bc コマンドは、電卓のプログラムである。一般的には、キーボードから数式を 読み込み、結果を画面に表示する。これを動作させてみなさい。

動作例:

$ bc [←]
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type warranty.
10+20[←]
30
^D
$ []
bc コマンドは、プロンプトを表示しないが、ユーザが打ち込んだ数式を行単位 で計算して表示する。終了するには、入力の終わり(end of file) を意味する ^D (Control+D) を押す。コントロール・キーを押しながら、 D キーを押す。

次のような機能が利用できる。

bc に -l オプションを付けると小数が扱える。 詳しくは、man bc を見なさい。

★練習問題(620) 標準入力の切り替え

bc コマンドに対して、ファイルから数式を読み込ませて計算させなさい。 まず、テキスト・エディタ、または、cat 等で数式が含まれたファイルを作成 しなさい。以下は、cat で作成する例である。Emacs を利用して作成してもよ い。
$ cat > expressions [←]
10+20[←]
2^40[←]
^D
$ cat expressions  [←]
10+20
2^40
$ []
次に作成した数式を、 キーボードの代わりにファイルからデータを読み込ませる。
$ bc < expressions [←]
30
1099511627776
$ []
次に、echo コマンドとパイプを使ってみなさい。数式は、ダブルクォーテーショ ンマーク(「"」)で括るとよい。
$ echo "10+20" [←]
10+20
$ echo "10+20" | bc [←]
30
$ echo "2^40" | bc [←]
1099511627776
$ []

★練習問題(621) 追記

以下のような手順で、5月から7月のカレンダ含むファイルを作成しなさい。
$ ls -l cal-2014-567.txt [←]
ls: cal-2014-567.txt: No such file or directory
$ cal 5 2014 > cal-2014-567.txt [←]
$ cal 6 2014 >> cal-2014-567.txt [←]
$ cal 7 2014 >> cal-2014-567.txt [←]
$ cat cal-2014-567.txt [←]
      5月 2014
日 月 火 水 木 金 土
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

      6月 2014
日 月 火 水 木 金 土
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

      7月 2014
日 月 火 水 木 金 土
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

$ []

★練習問題(622) headコマンド

headコマンドは、ファイルの先頭の 10 行(または、指定された 行数) を表示するコマンドである。以下の例では、ファイルの先頭 /usr/share/dict/wordsの先頭を表示している。
$ head /usr/share/dict/words  [←]
A
a
aa
aal
aalii
aam
Aani
aardvark
aardwolf
Aaron
$ head -5 /usr/share/dict/words  [←]
A
a
aa
aal
aalii
$ []
このコマンドの動きを確認しなさい。次のファイルを指定してみなさい。 また、-n (nは数)オプションの動きを調べなさい。ファイル が短い時、10行、または、それ以下の行数しかない時には、head コマンドが何 行表示するかを調べなさい。

★練習問題(623) tailコマンド

tailコマンド は、 headコマンドとは逆に、 ファイルの末尾の 10行(または、指定された行数)を表示するコマンドである。
$ tail /usr/share/dict/words  [←]
zymotoxic
zymurgy
Zyrenian
Zyrian
Zyryan
zythem
Zythia
zythum
Zyzomys
Zyzzogeton
$ tail -5 /usr/share/dict/words  [←]
zythem
Zythia
zythum
Zyzomys
Zyzzogeton
$ []
練習問題(622) と同じファイルを tail コマンドで表示してみなさい。
$ tail /usr/share/dict/words  [←]
$ tail ~/literacy-a4.txt [←]

★練習問題(624) lvコマンド

lv コマンド の使い方を復習しなさい。次のキーを確認しなさい。 練習問題(622) と同じファイルを lv コマンドで表示してみなさい。
$ lv /usr/share/dict/words  [←]
$ lv ~/literacy-a4.txt [←]

★練習問題(625) パイプ

次のコマンドを実行して、パイプの動作を確認しなさい。

★練習問題(626) lsとパイプ

ls コマンドは、画面に表示する時とパイプに表示する時で表示方法が異なる。 このことを確認しなさい。
$ ls [←]
$ ls | cat [←]
$ ls | lv [←]
パイプに出力する時にも、画面と同様の表示をさせるには、-C オプションを付 ければよい。
$ ls -C [←]
$ ls -C | cat [←]
$ ls -C | lv [←]

★練習問題(627) 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文字で改行される。

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

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

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

■課題6 プロセス、シェル標準入出力、Emacs insert-file、Emacs fill-paragraph

以下の問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。

(1) 以下の方法で、ps コマンドと kill コマンドを実行し、その結果をまとめ なさい。

  1. iTerm で端末を2つ開く。
  2. 片方の端末で強制終了させてもよいプロセスを作成しなさい。プロセスの 作成方法としては、たとえば、lv コマンドでテキスト・ファイルを表示する方 法が考えられる。
    $ lv ~/.bashrc [←]
    
  3. もう一方の端末で、そのコンピュータで動作している自分自身のプロセス だけを ps コマンドで表示しなさい。端末と結びついていないプロセスも含め なさい。
  4. もう一方の端末で、2. で作成したプロセスを表示しなさい。 grep コマンドと組み合わせることが望ましい。
  5. kill コマンドを使って、2. で作成したプロセスを殺しなさい。
  6. ps コマンドの結果を示し、4. でプロセスがきちんと死んだこと(表示さ れないこと)を示しなさい。
(2) シェルが持つ標準入出力の切り替え機能を使って、次のコマンドの結果を 全て含む1つのファイルを作りなさい。 このテキスト・ファイルを、レポートに含めなさい。 Emacs insert-file を使って、ファイルを挿入すると良い。 また、レポートには、次の結果を含めなさい。
$ ls -l 作成したファイル名

(3) The Unix Super Text の次の部分を読みなさい。

そして、項目についてついて調べて、簡単に説明しなさい。

(4) The Unix Super Text の次の部分を読みなさい。

そして、項目についてついて調べて、簡単に説明しなさい。

(5) [加点] The Unix Super Text の次の部分を読みなさい。

そして、項目についてついて調べて、簡単に説明しなさい。 (6) [加点] The Unix Super Text の次の部分を読みなさい。 次の操作を行いなさい。そのコマンドラインや画面の一部をレポートに含め、 これらの操作を行うことができることを示しなさい。
Last updated: 2014/05/02 10:10:30
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>