シェルのジョブ管理、デーモン

# ジョブとは
bashのようなシェルがバックグラウンドで実行したプロセスを制御するための仕組みです。
# ジョブを見る
```
root@*********:*************# sleep infinity &
[1] 2460
root@*********:*********# sleep infinity &
[2] 2464
root@*********:*********# jobs
[1]-  実行中               sleep infinity &
[2]+  実行中               sleep infinity &
root@*********:*********# fg 1
sleep infinity
^Z
[1]+  停止                  sleep infinity
root@*********:*********# bg 1
[1]+ sleep infinity &
```
### 気づき
PIDの横の[1]がジョブの番号
一つずつ　ジョブ番号が違う。

# セッションとは
ユーザがgtermのような端末エミュレータ、あるいはsshなどを通して```システムにログインしたきのログインシェルに対応するもの```です。```全てのセッションには、セッションを制御するための端末```が紐づいています。
...
セッション内プロセスを操作したいときは、端末を介してシェルを始めとしたプロセスに対して指示をし、また、それらプロセスの出力を受け取ります
# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

GNOME デスクトップに```ログインしてから、ログアウトするまでの間をセッション```といいます。 ログインマネージャによってユーザーが認証されると、セッションマネージャが開始されます。 ユーザーは、セッションマネージャによりセッションを管理できます。 たとえば、セッションの状態を保存して、次回ログインしたときにそのセッションに戻ることができます。
# 出典
https://docs.oracle.com/cd/E19957-01/817-6000/6mldto82d/index.html#:~:text=GNOME%20%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E3%80%81%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E3%81%AE%E9%96%93%E3%82%92%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%84%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%20%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E8%AA%8D%E8%A8%BC%E3%81%95%E3%82%8C%E3%82%8B%E3%81%A8%E3%80%81%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%81%8C%E9%96%8B%E5%A7%8B%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%20%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AF%E3%80%81%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%81%AB%E3%82%88%E3%82%8A%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E7%AE%A1%E7%90%86%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%20%E3%81%9F%E3%81%A8%E3%81%88%E3%81%B0%E3%80%81%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%A6%E3%80%81%E6%AC%A1%E5%9B%9E%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E3%81%9D%E3%81%AE%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E6%88%BB%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

### GNOME
今回は、デスクトップ環境「GNOME」について紹介します。
まず、デスクトップ環境とは、以前も取り上げたように、「X Window System」や「Wayland」の上で動作する、```GUIによる作業環境を提供```するものです。ツールバーやアイコン、ウィンドウマネージャ、ファイルマネージャなどのソフトウェアをまとめたもので、「```デスクトップ作業を行うのに必要なソフトウェアのセット```」と言うことができます。

GNOMEは、GNUプロジェクトの一部として開発されており、すべてをフリーソフトウェアで作るというポリシーの下で開発されています。「グノーム」と読む人が多いのですが、Gを発音せず「ノーム」と読む人もいます。1999年に開発が始まっており、比較的長い歴史を持っています。

GNOMEは、登場当初、WindowsやMac OS Xに似たインターフェイスを提供したため、Linux初心者の人気を集めました。その反面、高いカスタマイズ性を持ち、ユーザの好みの通りのデスクトップを構築できるという特徴もあり、またWaylandとの親和性も向上していることから、今なお多くの人が利用するデスクトップ環境です。

GNOMEを語る上で忘れることができないのが、ファイルマネージャ「Nautilus」です。Nautilusは、ファイルやディレクトリのブラウズだけでなく、Webサイトのブラウズも行うことができるソフトウェアで、ファイルやアプリケーション、インターネット上のリソースなどを統合し、リソースに素早くアクセスできるようになっています。

```多くのディストリビューションでも採用されているため、必ず覚えておきたいデスクトップ環境```です。

### 出典
https://linuc.org/study/knowledge/497/#:~:text=%E4%BB%8A%E5%9B%9E%E3%81%AF%E3%80%81%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%92%B0%E5%A2%83,%E3%81%9F%E3%81%84%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%99%E3%80%82

### 気づき
扱う端末が違うとセッションも違ってくるのか

# セッションと仮想ターミナルをみてみる
```
root@*********:**********# ps ajx
   PPID     PID    PGID     SID TTY        TPGID STAT   UID   TIME COMMAND
      0       1       1       1 ?             -1 Ss       0   0:01 /sbin/init s
      0       2       0       0 ?             -1 S        0   0:00 [kthreadd]
...
   2450    2626    2626    2435 pts/0       2629 S        0   0:00 sleep infini
   2450    2628    2628    2435 pts/0       2629 S        0   0:00 sleep infini
   2450    2629    2629    2435 pts/0       2629 R+       0   0:00 ps ajx
```
### 気づき
sleep infinityとps ajxのコマンドが同じセッションID、同じTTY(仮想ターミナルになっている）
違うタブでするとどこか違うところが出てくるのか？

### 同じターミナルで違うタブで入力してみた
```
vboxuser@***********:~/study$ sleep infinity &
[1] 2704
```
```
   2450    2626    2626    2435 pts/0       2450 S        0   0:00 sleep infini
   2450    2628    2628    2435 pts/0       2450 S        0   0:00 sleep infini
      2    2632       0       0 ?             -1 I        0   0:01 [kworker/0:0
      2    2660       0       0 ?             -1 I        0   0:00 [kworker/u2:
   2424    2691    2691    2691 pts/1       2706 Ss    1000   0:00 bash
      2    2703       0       0 ?             -1 I        0   0:00 [kworker/0:2
   2691    2704    2704    2691 pts/1       2706 S     1000   0:00 sleep infini
   2691    2706    2706    2691 pts/1       2706 R+    1000   0:00 ps ajx
```
### 気づき
違うタブで入力するとセッションIDも仮想ターミナルも違うことになった。

# プロセスグループ
```複数のプロセスをまとめてコントロール```するためのものです。セッションの中には複数のプロセスが存在します。
...
killコマンドのプロセスIDを指定する引数に```マイナス値を指定```すると、プロセスグループにシグナルを投げられます。
例えばPGIDが100であるプロセスグループにシグナルを投げたい時は```kill -100```とすれば良いです。
```
root@*********:**********# ps ajx
   PPID     PID    PGID     SID TTY        TPGID STAT   UID   TIME COMMAND
      0       1       1       1 ?             -1 Ss       0   0:01 /sbin/init s
      0       2       0       0 ?             -1 S        0   0:00 [kthreadd]
...
   2450    2626    2626    2435 pts/0       2629 S        0   0:00 sleep infini
   2450    2628    2628    2435 pts/0       2629 S        0   0:00 sleep infini
   2450    2629    2629    2435 pts/0       2629 R+       0   0:00 ps ajx
```
### 同じプロセスグループを見つける
プロセスグループは単純なsleep　infintyだとそれぞれのPGIDがつくが、プロセスが新たに子プロセスを作ったら同じPGIDになると思う。
```py
#!/usr/bin/python3
import os, sys
ret = os.fork()
if ret == 0:
    print("子プロセス:pid={}, 親プロセスのpid={}, PGID={}".format(os.getpid(), os.getppid(), os.getpgid(os.getpid())))
    exit()
elif ret > 0:
    print("親プロセス:pid={}, 子プロセスのpid={},PGID={}".format(os.getpid(), ret, os.getpgid(os.getpid())))
    exit()
sys.exit(1)
```
```
root@*********:************# python3 fork.py
親プロセス:pid=86215, 子プロセスのpid=86216,PGID=86215
root@************:**********# 子プロセス:pid=86216, 親プロセスのpid=1730, PGID=86215
```
### 気づき
親プロセス、子プロセスともにPGID=86215になっている

# デーモン
デーモンは```常駐プロセス```のことです。
...
システムの```開始から終了までの存在```し続けます。
...
* 端末から入出力する必要がないので、```端末が割り当てられない```。
* あらゆるログインセッションが終了しても影響を受けないように、```独自のセッションを持つ```。
* デーモンが生成したプロセスがデーモンの終了を気にしなくていいように```initが親```になっている。
# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
まだまだ初歩的な投稿は続きます