Process Groups, Sessions and Daemon Overview
為了弄清楚某個 daemon 的東西,
決定把 daemon 是什麼弄清楚,
網路上找到的資料實在又多又不清楚,
乾脆直接從 The Linux Programming Interface 把相關資料找出來做筆記。
- Process group 是一堆 related processes 組成的集合
- Session 是一堆 related process groups 組成的集合
Process group 和 Session 的定義是為了方便做 job control。
Process Group
一堆 related processes 共享相同的 process group identifier (PGID)。
這群 process 裡面會有一個 process group leader 是建立這個 process group 的 process,
這個 process group leader 的 PID 就會是這個 process group 的 PGID。
任何一個新的 process 被建立出來的時候,
他的 PGID 就會是他的 parent 的 PGID。
Process group 的 lifetime 是從 process group leader 建立這個 process group 開始算,
一直到所有在這個 process group 的 process 都離開這個 process group。
(有可能是 process 做完結束了,
或是 process 變換到了別的 process group)
Session
一群 related process groups 共享相同的 session identifier (SID)。
這群 process group 裡面有一個 session leader 是建立這個 session 的 process,
session leader 的 PID 就會是這個 session 的 SID。
任何一個新的 process 被建立出來的時候,
他的 SID 會是他的 parent 的 SID。
所有在同一個 session 裡的 process 都會共享一個controlling terminal,
一個 controlling terminal 會在 session leader 第一次開啟一個 terminal device 的時候建立,
而一個 terminal 只能當一個 session 的 controlling terminal。
=> session 和 controlling terminal 是一對一的關係
在任一時間點會有:
- foreground process group: 在 session 中的一組 porcess group,
只有這個 process group 裡面的 process 才能讀取從 controlling terminal 來的 input。 - background process groups: 其他不是 foreground process group 的所有 process group,
Terminal 運作
流程大概是:
開啟一個 terminal 的時候會有一個 session leader 會是 controlling process,
會有一組 foreground process group 等著接從 terminal 讀取的東西,
有可能是 user input 或是 user 給的 signal,
同時也會有一些 background process groups 存在。
當 terminal 結束的時候 kernel 會送 SIGHUP
給 session leader 通知他這個 terminal 結束了。
Shell Job Control
Process groups 和 session 主要是用來做 shell job control,
舉一個登入的例子:
使用者 login 用的那個 terminal 就是 controlling terminal,
而 login shell 就是 session leader 同時也是這個 terminal 的 controlling process,
從這個 shell 開始的所有 command 會建立出一個以上的 processes,
這些 processes 會變成新的 process groups,
從這些 process 再建立的新的 process 就會是那個建立他的 process 的 process group 的一份子。
所有這些 process 都從這個 shell 建立,
所以都屬於這個 login session。
Daemon
Daemon 具有的特性:
- long-lived: 通常是在系統啟動的時候跟著啟動開始運作,
一直到系統關機才結束。 - 跑在 background 而且不具有 controlling terminal: 確保 kernel 不會自動產生 job control 或 terminal 相關的 signal 去影響到 daemon。
通常 daemon 會用 ’d’ 結尾。
幾個常見的 daemon:
- cron
- sshd
- httpd