プロセス, ジョブ操作
-
Linux では、プロセステーブルというところに、実行中のプログラム全てに実行時間、実行ユーザーなど記録されている。プロセスが終了するとプロセステーブルから消える
-
ps # PID: プロセスID, TTY: プロセスの起動端末, CDM: プログラム名
- Linux が起動したプロセス(デーモン) は TTY ? と表示される
-
デーモンと Fork&Exec
- 一つの動作を担当するプロセス自身が、次の動作に必要となるプロセスを自分のコピーから作って処理を渡していくことで一連の処理が完成する
例えば、 sshd であれば、 ssh接続を待ち受けるプロセス -> 認証を受け持つプロセス -> 認証後に ssh 接続をログアウトまで担うプロセス。
最初のプロセスはフォーク後、他のユーザーからのログイン要求の待ち受けに回されることでサービスの継続が維持される - 親プロセス、子プロセス
- ps -f # PPID: 親プロセス。どこからフォークしたのか
- プロセスと実行ユーザー
- 上記の例だと、認証が終わるまでは root ユーザー、認証後はログインユーザーの権限でプロセスが実行される。
root ユーザーは通常のユーザの操作ではなく、このように linux のプロセス操作などに使われるのが基本用途なので、むやみに人が使わない - ps -u # 実行ユーザを表示
- 上記の例だと、認証が終わるまでは root ユーザー、認証後はログインユーザーの権限でプロセスが実行される。
- 一つの動作を担当するプロセス自身が、次の動作に必要となるプロセスを自分のコピーから作って処理を渡していくことで一連の処理が完成する
-
プリフォーク
- sshd のように一つのプロセスが処理にかかりっきりだと、他のアクセスからの対応が遅れる。
そのため、事前に複数のプロセスをフォークしておき待機させておくことで速度を上げる。httpd などのプロセスはこれをしている
- sshd のように一つのプロセスが処理にかかりっきりだと、他のアクセスからの対応が遅れる。
-
pstree # 全てのプロセス、親子関係をツリー状で表示
- systemd プロセス - 全てのプロセスの親プロセス。 linux 起動時に起動されるプロセス
-
ps -C httpd # httpd サービスのプロセスを表示
-
ps -e # 全てのプロセスを表示。 ps だけだと自身のプロセスだけ
-
'-' でオプションを記述する POSIX スタイル, aux でする BSD スタイル
-
バックグラウンドジョブ
- cp a.txt b.txt & # 最後に & をつけてコマンドする。 [] がこのバックグラウンドジョブの PID。 %1 のように % をつけて表記
- watch -n1 "ls -l ~/work" # 一定時間ごとにコマンドを実行
- fg [1] でコマンドプロンプトに処理を戻す。Ctrl + C で終了
- Ctrl + Z で中断。 bg [1] でバックグラウンド処理再開
- PID を指定しないと直前の ジョブを対象
- jods # 実行中のジョブを確認
- kill # ジョブ、プロセスの削除
- 親プロセスを kill すると子プロセスも消える