#プロセスとは
動いているプログラムのこと。
確認するためのツールは、使用するOSによって異なる。
Windows タスクマネージャー
Linux モニター
macOS アクティビティモニター
#プロセスの生成
コンピューターでは、複数の処理が同時に行われており、その一つ一つの処理をプロセスとして管理されている。
ターミナルで、lsコマンドを使用するとき、lsコマンドが実行される。
この時、lsのプロセスが生成される。
シェルのプロセスは、ログイン後あるいはターミナルの起動と共に開始されて、ログアウトまたはターミナルを閉じるまでメモリに保持される。
#プロセスIDとは
プロセスには固有の番号が割り当てられる。それをプロセスID(PID)と呼ぶ。
#プロセスの確認方法(コマンド)
LinuxのプロセスはPSコマンドで調べることができる。
psコマンドで見ることができる情報は、以下。
PID | TTY | TIME | CMD |
---|---|---|---|
プロセスID | ターミナルの一時的な名前 | CPUの稼働時間 | コマンド |
実際に実行してみると
$ ps
PID TTY TIME CMD
7483 pts/1 00:00:00 zsh
9884 pts/1 00:00:00 ps
#tty
TTY:teletypewriterの略
古い歴史がある。
UNIX黎明期に大量に使われていた端末がテレタイプライター。
コンピュータからの出力は、現在のような画面ではなくて、長い紙に打ち出されていた。人間からの入力には、紙テープやタイプライターが使われていた。
この端末からttyという名称が来ている。
そして、現在では、ハードウェアだった端末をソフトウェアにしてしまったのが、端末エミュレータである。
例:GNOME terminal, Konsole, mltermなど。
端末を識別するために端末の1つ1つにpts/0のような一時的な名前が割り振られる。
psコマンド単体では、自分のプロセスのみ表示されるが、aをつけることですべてのプロセスを見ることができる。
すべてというのは、SSHで接続したターミナルのプロセスや、複数のターミナルを開いた状態で端末が仮想的に複数存在してるときのすべてのプロセスということである。
以下では、現在psコマンドを使った端末には、pts/0が割り当てられて、
他に開いている端末には、pts/1が割り当てられる
$ ps a
PID TTY TIME CMD
3133 pts/0 00:00:00 zsh
9884 pts/0 00:00:00 ps
7483 pts/1 00:00:00 zsh
ターミナルをもっと開いていくと、pts/2, pts/3..とどんどん割り当てられていく。閉じると、割り当てが解除される。解除された名前は、次にターミナルが開かれたときにその名前が使われる。それは同じターミナルを示しているわけではなく、ただの識別するためのものである。
#psとシェルが別々に表示されているが違いは?
psを実行するとシェルとpsが表示されている。
それは、psがextarnal コマンドであるからである。
internal command
cd , source , fg など
シェルに組み込まれているコマンド。
シェルに組み込まれているので、新しいプロセスを生成せず実行されるので、実行速度がとても早い。
External command
ls , catなど
シェルに組み込まれていないコマンド。
そのコマンドは、呼ばれるたびに新しいプロセスを生成する。
internal コマンドが呼ばれるとシェルのタイムが加算される。
psを実行したときに、psも表示されるがこれはpsはextarnalコマンドであり、新しくプロセスが生成されているからであり、outputが出力される時には、プロセスが終了している。
internalかexternal か判別する方法は、typeコマンドを使用する。
$ type cat
cat is /bin/cat
$ type cd
cd is a shell builtin
#internal コマンドのTIMEの変化を見てみる
internal コマンドが呼ばれるとシェルのタイムが加算される。基本的に起動してpsを実行すると0である。
そこで以下を実行すると
$ while
do
x=1
done
終了するときはctr+Cをおす。
そして、psコマンドで確認すると実行された時間だけzsh(シェル)のtimeが加算されている
$ ps
PID TTY TIME CMD
7483 pts/1 00:00:02 zsh
9884 pts/1 00:00:00 ps
#external コマンドのプロセスの動きを見る
yesというコマンドがある。これは、プロセスが止まるまで(killされる)までyesを出力し続ける。今回は /dev/nullに出力し続ける。
- /dev/null に出力されるものはすべて破棄されて、何も表示されない。
コマンドをバックグラウンドで実行する
コマンドを入力するとコマンドが終了するまで待たなければいけない。その間他のコマンドを打つことはできない。
しかし、時間がかかり他のコマンドを使いたい場合や、今回のようにプロセスを確認したい場合は&を使用することでバックグラウンドで実行することができる。
$ yes > /dev/null &
[1] 9880
これでバックグラウンドでプロセスID 9880として、yesコマンドが実行され続けている。
この状態でpsを確認してみると
$ ps
PID TTY TIME CMD
7483 pts/1 00:00:00 zsh
9800 pts/1 00:00:50 yes
9884 pts/1 00:00:00 ps
yesコマンドのプロセスが生成されていて、50秒間実行されているということがわかる。
#プロセスを終了(kill)する
プロセスをコマンド終了させることができる。その時には、killコマンドを使う。
killの引数にはプロセスIDを渡す。
そのほかkillall などある。
####参考
https://www.theunixschool.com/2012/09/ps-command-what-does-time-indicate.html?m=1
https://www.theunixschool.com/2012/03/internal-vs-external-commands.html
https://www.howtogeek.com/428174/what-is-a-tty-on-linux-and-how-to-use-the-tty-command/
https://www.atmarkit.co.jp/ait/articles/1706/23/news010.html