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/
「端末」を複数開くと、「シェル」のプロセスが2つ。 プログラムとしては、同じ bash だが、プロセスとしては別物になる。
その昔は、1度に1個のプログラムだけしかメモリに入れられなかった。 (プログラムとプロセスの違いが希薄。)
$ ls
プロセスには、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プロセスに対応。左から次のような意味を持つ。
/dev/ttys000
は
ttys000
になる。
TIME
COMMAND
$ 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)
U
(uninterruptible), D
(Disk),
S
(Sleep)、I
(Idle)
Z
(Zombie)
T
(Traced)
$ ps a
端末と結びついていないプロセスも含めるには、x オプションもつける。
$ ps ax
$ 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
%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 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 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
$
プロセスを殺すとは、プロセスが自主的に終了しない時に、強制的に終了させ ること。
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 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行削除の意味。
^C
や ^\
で死なないプロセス
(lv, emacs など)
を殺すには、kill コマンドを使う。
$ kill pid
これは、プロセス識別子pidのプロセスを殺す。
他人のプロセスは、権限がないので殺せない。
注意:pid
には、プロセス識別子となる番号を入れる。「p」、
「i」「d」と3文字打つのではない。たとえば、PID が 1023 のプロセスを殺す
時には、次のように打つ。
$ kill 1023
-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 はプロセス識別子。 ;
図? プログラムの標準入出力の普通の接続先
$ cat
Line 1
Line 1
Line 2
Line 2
^D
$
$ 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
$
C-x i
と打つ。
Insert file: ~/
Insert file: ~/挿入したいファイル名
例:実行前
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 の使い方
M-q
(Esc q
) キーを押す。
C-u 数 C-x f
$ ps
$ ps l
ps コマンドに、次のオプションを与えて、動作を確認しなさい。
$ ps l
$ ps -l
「-」の有無で、使い方が違うことがある。
$ ps u
$ ps -u ログイン名
他のオプションについて、man ps を見て見なさい。
$ ps aux | lv
この方法を、確かめなさい。lv コマンドについては、
手引き 2.3.14 参照。
lv コマンド
を参照しなさい。q(終了)、次のページへの移動(スペースキー)、
ページを戻る(b)は、必ず覚えなさい。
$ ps aux
$ ps auxw
あるいは、iTerm の画面を横幅を広げて ps コマンドを打ちなさい。
横幅を広げるには、右下の斜線が入っている部分をドラッグすればよい。
$ top
$ top -o cpu
(CPU を消費している順)
MacOSX では、top コマンド自分自身が「重たい」と認識される。
その場合は、top コマンドが表示を変更する頻度を下げる。
$ top -s 4 -o cpu
man top でマニュアルを表示して、-o オプションと -U の使い方を
調べなさい。そして、メモリの利用順 (rsize) で表示しなさい。
-U オプションで自分自身のプロセスだけを表示しなさい。
$ top -U 自分のログイン名
$ pstree
$ pstree | lv
iTerm の画面の横幅を広げると見やすい。
$ open "/Applications/Utilities/Activity Monitor.app"
または、Finder で、「移動」メニューから「ユーティリティ」を
選択。「アクティビティモニタ.app」のアイコンをダブルクリック。
アクティビティモニタの表示
表示されたら、「CPU」タブを表示しなさい。そして、 表示されるプロセスの順序を変えてみなさい。
top コマンドの表示と比較しなさい。
$ cat
aaa
aaa
bbb
bbb
^C
$
なお、^C と 入力の終わりを意味する ^D は働きが異な
る。どちらでもプロセスが終了することがあるが、強制終了したい場合には、
^C を使いなさい。
$ ls -R ~/Library
(大量の表示、省略)
^C
$
C-c
) は、C-x C-c
のように、その
キーに割り当てられた関数を実行する意味。)
C-c
は、C-x
と同じように、2ストローク以上で1つの意
味をなすことが多い。何もない状態でC-c
を打った場合には、
C-g
によりキャンセルしなさい。
kill コマンドを使って、プロセスを殺してみなさい。
$ lv literacy-a4.txt
$ lv ~/.bashrc
$ ps
$ kill PID
lv コマンドの代わりに、bash からなるプロセスを殺すとどうなるか調べなさい。
/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 コマンドを使って次のようなことを行ってみなさい。
/etc/services
にある http
が含まれる行
/etc/services
にある pop
が含まれる行
/etc/services
にある imap
が含まれる行
ls
が含まれる行
grep コマンドには次のようなオプションを指定することができる。
$ 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 オプションを付けると大文字と小文字を関係なく調べるこ
とができる。
$ ps uxw | grep cat
$ kill 数
(まず、Commandキー() と Option キーを左手で押し、
押しっぱなしの状態で、右手で Esc キーを一度押して離す。)
この機能を確認しなさい。なお、この機能では、ウインドウを開くプロセスし か強制終了できない。iTerm の中で実行されるプロセスや端末とは結びついて いないプロセスを強制終了するには、kill コマンドを使うしかない。
$ 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
$
動作例:
$ 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 を見なさい。
$ 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
$
$ 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
$
$ 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
$
このコマンドの動きを確認しなさい。次のファイルを指定してみなさい。
$ head /usr/share/dict/words
$ tail ~/literacy-a4.txt
-n
(nは数)オプションの動きを調べなさい。ファイル
が短い時、10行、または、それ以下の行数しかない時には、head コマンドが何
行表示するかを調べなさい。
$ 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
$ lv /usr/share/dict/words
$ lv ~/literacy-a4.txt
$ ls -l /usr/bin
$ ls -l /usr/bin | lv
$ ls -l /usr/bin
$ ls -l /usr/bin | head
$ ls -l /usr/bin | head -20
$ ls -l /usr/bin
$ ls -l /usr/bin | head
$ ls -l /usr/bin | head -20
$ ls
$ ls | cat
$ ls | lv
パイプに出力する時にも、画面と同様の表示をさせるには、-C オプションを付
ければよい。
$ ls -C
$ ls -C | cat
$ ls -C | lv
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文字で改行される。
この機能を確認しなさい。
C-u 数 C-x f
あるいは、折り返したい位置にカーソルを移動してから次のように打つ。
C-x f
以後、M-q または Esc q で折り返しを行った時には、指定
した文字数で折り返される。この機能を確認しなさい。
(1) 以下の方法で、ps コマンドと kill コマンドを実行し、その結果をまとめ なさい。
$ lv ~/.bashrc
$ ls -l 作成したファイル名
(3) The Unix Super Text の次の部分を読みなさい。
(4) The Unix Super Text の次の部分を読みなさい。
2>file
」の意味
(5) [加点] The Unix Super Text の次の部分を読みなさい。