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

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

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

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

■連絡事項

■プロセス

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

◆プロセスとは

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

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

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

メモリにプロセスが3つ、オペレーティング・システム・カーネル、ハードディスク、プロセッサ
プログラムとプロセス

◆プロセスの役割

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

プロセスの操作

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

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

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

■プロセスの観察

手引き 2.10.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がそのプロセスを実行するために費やした時間。
CMD (または COMMAND)
そのプロセスを起動した時のコマンド。 プログラムが含まれているファイルの名前の一部。
端末は、iTerm のウィンドウごとに違う。 端末の名前は、tty コマンドで調べることができる。
$ tty [←]
/dev/ttys000
$ []

◆プロセスと端末

プロセスは、端末に関連して次のように分類される 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)
キーボードや他のプロセスからの入力を待っている。

◆プロセスとユーザ

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

◆プロセスと資源

psコマンドにuオプション(user-oriented)を付けると、 プロセスに割り当てられたメモリ資源やCPU資源が表示する。 練習問題 ps u 参照。

◆プロセスの親子関係

プロセスには、生みの親となるプロセスが1個ある。 もとのプロセスを「親プロセス」、 親プロセスから生まれたプロセスを 「子プロセス」とう。 psコマンドにlオプション(long)を付けると、 親プロセスを表示することができる。 親子関係により、プロセスは全体として木構造 木構造(tree structure) を作る。

練習問題 ps lと親プロセスpstreeコマンド 参照。

■プロセスを殺す(kill)

手引き 2.10.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 x			プロセスの一覧の表示(BSD,Linux)
ps ax			プロセスの一覧の表示(BSD,Linux)
stty all		端末の状態(キーの割り当て)の表示(BSD)
stty -a			端末の状態(キーの割り当て)の表示(System V,Linux)
kill PID		プロセスを殺す
kill -KILL PID		プロセスを殺す(必殺)
PID はプロセス識別子。PIDと打つのではない。 BSD は、MacOSX、FreeBSD 等。 System Vは、Solaris等。

■シェルと標準入出力

シェル(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 [←]

キーボード、標準入力、プログラム、標準出力、ファイル、標準エラー出力、画面
図? プログラムの標準出力のファイルへの切替え

シェルは、「記号<」 があると、標準入力をキーボードから指定され たファイルに切り替え、指定されたプログラムを実行する。
$ head -4 < file1 [←]
headコマンド は、ファイルや標準入力の先頭を表示する ためのコマンド。-n (nは数)というオプションが与 えられると、先頭の n 行だけ表示する。

ファイル、標準入力、プログラム、標準出力、標準エラー出力、画面
図? プログラムの標準入力のファイルへの切替え

シェルは、「記号|」があると、次の動作を行う (パイプ(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
$ []

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

ファイルを介しても類似の操作は可能だが、後で不要なファイルを消さなけれ ばならない。
$ 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 -l | cat -n | head -4 [←]
     1	 total 99
     2	 drwx------   4 yas  prof   3072  4 10 17:37 Desktop
     3	 drwx------   3 yas  prof   1024  3 11 13:52 Documents
     4	 drwx------   2 yas  prof     80  3 10 18:16 Downloads
$ []
cat コマンドは、「-n」オプションを付けると行番号を付加する。

◆標準エラーの役割

標準出力の切り替えを行ったとしても、標準エラーは画面に表示される。
$ 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
ファイルが存在しても、消さずにその後ろに追加する。
$ echo hello [←]
hello
$ echo hi [←]
hi
$ echo hello > hello.txt [←]
$ cat hello.txt [←]
hello
$ echo hi > hello.txt [←]
$ cat hello.txt [←]
hi
$ echo hello > hello.txt [←]
$ cat hello.txt [←]
hello
$ echo hi >> hello.txt [←]
$ cat hello.txt [←]
hello
hi
$ []

◆lsとパイプ

ls コマンドは、出力が端末かパイプかで表示方法を変える。 パイプの場合、縦になる。 練習問題 lsとパイプ 参照。

◆ls コマンドの -1 オプションと -C オプション

ls には、次のようなオプションがある。
-1 (数字の 1 であり、アルファベットの L の小文 字の l ではない。)
(端末でパイプでも)縦に表示する
C オプション
(端末でパイプでも)横に表示する。
練習問題 lsとパイプ(1) 参照。

■Emacs

◆insert-file

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

◆タブ・キー

Emacs のタブ・キーは、単にタブを打ち込むのではなく、自動的な字下げ(イン デント)の機能が働くことがある(indent-for-tab-command)。

iTerm 等の端末の結果を、emacs にコピーする時に、タブをタブとして挿入し たい時には、M-x local-set-key で、次のようにタブ・キーの定義を self-insert-command に変更する方法がある。

M-x local-set-key[←][tab]self-insert-command[←]

■MacOSX

◆pbcopyコマンドとpbpasteコマンド

MacOSX で、シェルと Firefox/Thunderbird/iTerm 等のウィンドウを開くアプ リケーション間で、コピー&ペーストでデータをやりとりするために、次のコ マンドが使える。
pbcopy
標準入力からデータを読み込み、ペーストボード(クリップボード)に保存する。
pbpaste
ペーストボード(クリップボード)からデータを読み出し、 標準出力に出力する。
使い方の例

■実習

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

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

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

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

$ ps [←]

★練習問題(802) 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 を見て見なさい。

★練習問題(803) 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
大文字小文字を無視する
この動きを確認しなさい。

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

ps コマンドで大量の表示の中から特定のプログラムを見つけたい時には、 grep コマンドと組み合わせて用いると便利である。次の例は、bash コマンド、 および、iTerm の中で実行している Emacs のプロセスを探している。
$ ps | grep bash [←]
34121 ttys000    0:00.03 -bash
75409 ttys000    0:00.00 grep bash
75195 ttys001    0:00.01 -bash
34226 ttys002    0:00.05 -bash
75399 ttys003    0:00.01 -bash
$ ps | grep Emacs [←]
75412 ttys000    0:00.00 grep Emacs
75404 ttys003    0:00.09 /Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs -nw literacy-a7.txt
$ []
この機能を利用して見なさい。

端末と結びついていないプロセスを調べるには、ps コマンドに x オプション を与える。次のようにして、Finder、Dock、Emacs、Firefox 等のプロセスの PID を調べなさい。

$ ps x | grep    Finder [←]
$ ps x | grep    Dock [←]
$ ps x | grep    fire [←]
$ ps x | grep    iTerm [←]
grep コマンドに -i オプションを付けると大文字と小文字を関係なく調べるこ とができる。このことを確認しなさい。
$ ps x | grep -i finder [←]
$ ps x | grep -i dock [←]
$ ps x | grep -i fire [←]
$ ps x | grep -i iterm [←]

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

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

★練習問題(806) ps u

psコマンドにuオプション(user-oriented)を付けると、 プロセスに割り当てられたメモリ資源や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
プロセスが生成された時刻。

★練習問題(807) ps lと親プロセス

psコマンドに「l」オプション(long)をつけると親プロセスのプロセス識別子が 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。

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

ps コマンドは、端末の横幅に合わせて表示する。 長い COMMAND が途中で切れてしまう。 表示を増やすには、次の方法がある。 次のように、w オプションの効果を確認しなさい。
$ 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
$ []
iTerm の画面を横幅を広げて ps コマンドを打ちなさい。 横幅を広げるには、右下の斜線が入っている部分をドラッグすればよい。

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

★練習問題(810) topコマンドのkillによる強制終了

top コマンドのプロセスを kill コマンドで殺してみなさい。

★練習問題(811) ^Dによるcatコマンドの終了

cat コマンドと 標準出力の切り替え で短いファイルを作 成してみなさい。
$ cat > file1.txt [←]
Line 1[←]
Line 2[←]
^D
$ cat file1.txt  [←]
Line 1
Line 2
$ []

★練習問題(812) ^Cによる cat コマンドの強制終了

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

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

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

★練習問題(814) yesコマンドの強制終了

yes コマンドは、端末に y と表示し続けるコマンドである。 普通、終了することはないので、強制終了が必要になる。 次のように実行すると、最初の 10 行だけ表示する。
$ yes | head [←]
y
y
y
y
y
y
y
y
y
y
$ []
yes コマンドは普通、終了しないので、最後の 10 行を表示しようと tail コ マンドを使っても表示されない。
$ yes | tail [←]
この時、別の端末で yes コマンドのプロセスを kill してみなさい。
$ ps [←]
(yes のプロセスの PID を調べる)
$ kill PID [←]
$ []
yes のプロセスが終了すると、tail コマンドが最後の 10 行を表示する。 このことを確認しなさい。

yes と tail を ^C で強制終了するとどうなるか。調べなさい。

$ yes | tail [←]
^C
$ []
yes コマンドと lv コマンドを実行するとどうなるか調べなさい。
$ yes | lv [←]
yes コマンドを単独で実行し、^C で停止しなさい。
$ yes [←]
...
^C
$ []
cat -n と合わせて実行し、必要なら強制終了しなさい。
$ yes | cat -n [←]
$ yes | cat -n | lv [←]
$ yes | cat -n | head [←]
$ yes | cat -n | tail [←]

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

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

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

手引き 2.10.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 からなるプロセスを殺すとどうなるか調べなさい。

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

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

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

次の一連の操作を行いなさい。
$ ps 引数 | grep オプション パタン [←]
$ kill  [←]
たとえば、次の例のように、 PaperCut のプロセスを探して、殺してみなさい。
$ ps x | grep -i paper [←]
94070   ??  SN     0:01.40 /Applications/PCClient.app/Contents/MacOS/JavaAppLauncher biz.papercut.pcng.client.uit.UserClient
(端末がないので、ps に x オプションをつける。grep に -i オプションをつけて、大文字小文字を無視する。)
$ kill 94070 [←]
(単に kill だけでは、プロセスは死んでいない。)
$ kill 94070 [←]
(2回目にエラーが出ないので、プロセスが生きていることがわかる。)
$ kill -KILL 94070 [←]
$ kill -KILL 94070 [←]
-bash: kill: (94070) - No such process
(2回目にエラーが出たので、プロセスが死んでいることがわかる。)
$ ps x | grep -i paper [←]
94192 s000  S+     0:00.00 grep -i paper
(ps コマンドでも表示されない。)
$ []

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

次のように、cal コマンドを実行して、>による標準出力の切り替 えが動作することを確認しなさい。
$ cal 5 2017 [←]
      5月 2017
日 月 火 水 木 金 土
    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 2017 > cal-2017-05.txt [←]
$ ls -l cal-2017-05.txt [←]
-rw-r--r--  1 yas  prof  141  5  8  2017 cal-2017-05.txt
$ cat cal-2017-05.txt [←]
      5月 2017
日 月 火 水 木 金 土
    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

$ []

★練習問題(820) 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 を見なさい。

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

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
$ []

★練習問題(822) 追記

以下のような手順で、5月から7月のカレンダ含むファイルを作成しなさい。
$ ls -l cal-2017-567.txt [←]
ls: cal-2017-567.txt: No such file or directory
 cal 5 2017 >  cal-2017-567.txt
$ cal 6 2017 >> cal-2017-567.txt [←]
$ cal 7 2017 >> cal-2017-567.txt [←]
$ cat cal-2017-567.txt [←]
      5月 2017
日 月 火 水 木 金 土
    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月 2017
日 月 火 水 木 金 土
             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月 2017
日 月 火 水 木 金 土
                   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
$ []
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 コマンドが何 行表示するかを調べなさい。

★練習問題(824) 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
$ []
練習問題(823) と同じファイルを tail コマンドで表示してみなさい。
$ tail /usr/share/dict/words  [←]
$ tail ~/literacy-a4.txt [←]

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

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

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

ls コマンドは、出力が端末かパイプかで表示方法を変える。 パイプの場合、縦になる。
$ ls [←]
file1.txt	file2.txt
$ ls | cat [←]
file1.txt
file2.txt
$ []
このことを確認しなさい。
$ ls [←]
$ ls | cat [←]
$ ls | lv [←]
ls-1 オプションは、(端末でパイプでも)縦に表示するオプ ションである。-1 は、数字の 1 であり、アルファベットの L の小文字の l ではない。ls-C オプショ ンは、(端末でパイプでも)横に表示するオプション。
$ ls [←]
file1.txt file2.txt
$ ls -1 [←]
file1.txt
file2.txt
$ ls -C [←]
file1.txt file2.txt
$ ls -C | cat [←]
file1.txt file2.txt
$ []
このことを確認しなさい。

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

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

★練習問題(828) psとパイプ

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

★練習問題(829) pbpaste コマンド

Web ページや iTerm の結果結果を Emacs にペーストする時に、タブが含まれ ているために、自動的に字下げが行われて、表示が 乱れてしまうことがある。この問題は、 pbpaste コマンドと Emacs C-x i (insert-file) で解決できる。このことを確認しなさい。

まず、pbpaste コマンドを使って、Web ページの一部やiTerm の表示の一部を ファイルに保存しなさい。

  1. Web ブラウザで Web ページを表示する。あるいは、 iTerm で、コマンドを実行する。
  2. その一部をマウスで選択し、コピーする (メニューバーの「編集」メニューの「コピー」を選ぶ。)
  3. 端末で pbpaste コマンドを実行する。
    $ pbpaste > file1.txt [←]
    
  4. Emacs を実行する。
    $ emacs file2.txt [←]
    
  5. 先ほど保存したファイルを、 Emacs C-x i (insert-file) で読み込む。

★練習問題(830) pbcopy コマンド

pbcopy コマンドを使って 端末でアクセスできるファイルや、コマンドの結果を Thunderbird や別の iTerm にコピーしてみなさい。
  1. コピーしたいファイルを標準入力として pbcopy コマンドを実行する。
    $ pbcopy < ファイル名 [←]
    
    cat コマンドとパイプを使う方法もある。
    $ cat ファイル名 | pbcopy [←]
    
    cat コマンドではなく、他のコマンドでも良い。
    $ ps    | pbcopy [←]
    
    $ ls -l | pbcopy [←]
    
  2. Thunderbird や別の iTerm で、ペーストの動作を行う。 (メニューバーの「編集」から「ペースト」を選ぶ、等。)

★練習問題(831) expand コマンド

iTerm の結果結果を Emacs にペーストする時に、タブが含まれているために、 自動的に字下げ が行われて、表示が乱れてしまうことがある。 expand コマンドをつかうと、タブを空白に置き換えてくれる。
$ ls [←]
(タブ入りの表示、横)
$ ls | expand [←]
(タブを含まない表示、縦)
$ ls -C | expand [←]
(タブを含まない表示、横)
$ ls -C | expand | pbcopy [←]
(タブを含まない表示が、クリップボードにコピーされる。画面には表示されない。)
$ []
この動きを確認しなさい。 The Unix Super Text 35.2.7 exapnd、unexpand 参照

★練習問題(832) ことえりのプロセスの表示と再起動

MacOSX の仮名漢字変換を行っているプログラム「ことえり」のプロセスを、 ps コマンドで観察しなさい。
$ ps x | grep Kotoeri [←]
$ ps x | grep -i kotoeri [←]
仮名漢字変換がうまく動作しなくなった時、ことえりのプロセスを殺すと回復することがある。
$ kill ことえりのプロセスのPID [←]
ことえりのプロセスを殺すと、もう一度ことえりが自動的に実行され、ことえ りのプロセスが再び現れる。

★練習問題(833) ことえり、「推測候補表示」の無効化による軽量化

MacOSX の仮名漢字変換を行っているプログラム「ことえり」が、頻繁に動作し なくなる時には、次のような設定をすると頻度が減ることがある。
  1. 一番上のメニューバーの「あ」、または、「A英字」等と表示されている部分をクリックし、 表示されるメニューから「"ことえり"環境設定を開く...」を選ぶ。 あるいは、 システム環境設定 を実行し、「キーボード」、「入力ソース」、「ことえり」と選択してもよい。
  2. 右側のウィンドウをスクロールして中ほどの「候補表示」の下の「推測候 補表示」の左側のチェック・ボックスのチェックをはずす。
    ことえり環境設定、推測候補表示 (クリックで拡大)

★練習問題(834) ps lによるプロセスの木構造の確認

ps l コマンドを使うと、親プロセスの PID が表示される。 この仕組みを使って、親プロセスの親プロセスを調べなさい。 さらに、その親プロセスを調べなさい。

次の例は、bash の親プロセス、その親プロセス、さらにその親プロセスを調べ て、iTerm であることを突き止めている。

$ ps alx | grep bash [←]
 1013  1506  1230   0  31  0  2436436   1032 -      S      ??    0:00.00 /bin/bash /usr/local/MacGPG2/libexec/shutdown-gpg-agent
 1013  1643  1642   0  31  0  2461016   1336 -      S    s000    0:00.01 -bash
 1013  1609  1608   0  31  0  2461016   1312 -      S    s002    0:00.01 -bash
 1013  1654  1609   0  31  0  2432784    604 -      S+   s002    0:00.00 grep bash
$ ps alx | grep 1608 [←]
    0  1608  1602   0  33  0  2469444   2388 -      Us   s002    0:00.01 login -fp yas
 1013  1609  1608   0  31  0  2461016   1312 -      S    s002    0:00.01 -bash
 1013  1656  1609   0  31  0  2432784    604 -      S+   s002    0:00.00 grep 1608
$ ps alx | grep 1602 [←]
 1013  1602  1230   0  49  0  2598208  44240 -      S      ??    0:00.99 /Applications/iTerm.app/Contents/MacOS/iTerm
    0  1642  1602   0  33  0  2468920   2432 -      Ss   s000    0:00.01 login -fp yas
    0  1608  1602   0  33  0  2469444   2388 -      Us   s002    0:00.01 login -fp yas
 1013  1658  1609   0  31  0  2432784    604 -      S+   s002    0:00.00 grep 1602
$ []
  1. bash のプロセスの PID は、1643 と 1609 。そのうち、PID が 1609 の PPID は、1608 。
  2. PID が 1608 のものを探すと、login というプロセスである。その PPID は、1602 。
  3. PID が 1602 のものを探すと、iTerm である。

最後は、PID が 1 番のプロセスにたどりつく。このことを確認しなさい。

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

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

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

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

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

Command+Option+Escキー
「アプリケーションの強制終了」のウインドウ

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

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

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

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

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

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

★練習問題(838) 「アクティビティモニタ.app」によるメモリ使用量の調査

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

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

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

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

  1. iTerm で端末を3つ開く。
  2. 最初の端末では、emacs を実行し、レポートを作成する。
    $ emacs literacy-a8.txt [←]
    
  3. 2つ目の端末で強制終了させてもよいプロセスを作成しなさい。プロセス の作成方法としては、たとえば、lv コマンドでテキスト・ファイルを表示する 方法が考えられる。
    $ lv ~/.bashrc [←]
    
  4. 3つ目の端末で ps コマンドを実行し、3. で作成したプロセスを表示しなさい。 grep コマンドと組み合わせることが望ましい。
    $ ps | grep lv [←]
    (表示)
    $ []
    
  5. kill コマンドを使って、3. で作成したプロセスを殺しなさい。
    $ kill pid [←]
    
  6. ps コマンドの結果を示し、6. でプロセスがきちんと死んだこと(表示さ れないこと)を示しなさい。
    $ ps | grep lv [←]
    (表示)
    $ []
    
レポートには、4. から 6. の結果を含めなさい。

練習問題 ps コマンドと grep コマンド練習問題 killコマンド練習問題 ps | grep、kill参照。

(2) シェルが持つ標準入出力の切り替え機能を使って、次のコマンドの結果を 全て含む1つのファイルを作りなさい。

このテキスト・ファイルを、レポートに含めなさい。 Emacs insert-file を使って、ファイルを挿入すると良い。

練習問題 追記参照。

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

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

(4) [加点] 次のプログラムを実行し、プロセスの木構造を調べなさい。

これらのプログラムから作られたプロセスを含むプロセスの木構造を書きなさい。 木構造の表記方法は、以下のように「-」を使った 字下げによる木の表現 とする。
- 1 /sbin/launchd
-- NNN /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow
省略
--省略 NNN bash
--省略 NNN bash
木の節には、PID とプログラムの名前(ps コマンド COMMANDの下の表示)を書きなさい。 上記の NNN の部分には実際に調べた PID を書きなさい。 木構造の根の部分は、PID が 1 のプロセスである。 レポートの回答には、「省略」はしないで、きちんと書きなさい。

この木構造には、次のプログラムから作られたプロセスを必ず含めなさい。

木構造から、これらのプロセスに居たるまでの途中の節も必ず書きなさい。 それ以外の節については、省略しても良い。たとえば、 PaperCut のプロセスや Finder のプロセスを省略して良い。

なお、PID やプロセスの親子関係は、ログアウトしてログインしたり、 ウィンドウを閉じて開いたりすると変化する。 従って、PID やプロセスの親子関係を調べる時には、ウィンドウを閉じたり開いたりしないこと。

次の練習問題を参考にしなさい。

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

次の操作を全て行いなさい。そのコマンドラインや画面の一部をレポートに含 め、これらの操作を行うことができることを示しなさい。
Last updated: 2017/05/12 09:56:31
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>