---
# System prepended metadata

title: systemd & systemctl & journalctl
tags: [' TODO', Unix-like]

---

---
tags: Unix-like, TODO
---
# systemd & systemctl & journalctl

[TOC]

## systemd

 * **平行處理所有服務，加速開機流程**
   舊的 init 啟動腳本是一項一項任務依序啟動的模式，systemd 可以讓所有的服務同時啟動，加快系統啟動的速度。

 * **一經要求就回應的 on-demand 啟動方式**
    systemd 全部就是僅有一隻 systemd 服務搭配 systemctl 指令來處理，無須其他額外的指令來支援。由於常駐記憶體，因此任何要求（on-demand）都可以立即處理後續的 daemon 啟動的任務。

 * **服務相依性的自我檢查**
   如果 B 服務是架構在 A 服務上面啟動的，那當你在沒有啟動 A 服務時啟動 B 服務時， systemd 會自動幫你啟動 A 服務。

 * **將多個 daemons 集合成為一個 target**
   執行某個 target 就是執行好多個 daemon。

 * **向下相容舊有的 init 服務腳本**

 * **依 daemon 功能分類**
   將服務單位 unit 區分為 service、socket、target、path、snapshot、timer 等多種不同的類型 type，方便管理員的分類與記憶。
   
   | Type | Description |
   |------|-------------|
   | service | **一般服務**，主要是系統服務，經常被使用到的服務大多是這種類型 |
   | socket | **內部程序資料交換的插槽服務**，一般用於本機服務比較多，例如我們的圖形界面很多的軟體都是透過 socket 來進行本機程序資料交換 Inter-process communication 的行為 |
   | target | **執行環境**，一群 unit 的集合 |
   | mount | **檔案系統掛載相關的服務**，來自網路的自動掛載、NFS 檔案系統掛載等與檔案系統相關性較高的程序管理 |
   | path | **偵測特定檔案或目錄**，某些服務需要偵測某些特定的目錄來提供佇列服務，例如最常見的列印服務，就是透過偵測列印佇列目錄來啟動列印功能 |
   | timer | **循環執行的服務**，由 systemd 主動提供的，比 [anacrontab](http://linux.vbird.org/linux_basic/0430cron.php#anacron) 更加有彈性 |

## systemctl

systemd 這個啟動服務的機制，主要是透過名為 systemctl 的指令來處理。跟以前 systemV 需要 `service` / `chkconfig` / `setup` / `init` 等指令來協助不同。

 * `start` ：立刻啟動
 * `stop` ：立刻關閉
 * `restart` ：立刻重啟
 * `reload` ：不關閉 unit 的情況下，重新載入設定檔
 * `enable` ：設定下次開機時會被啟動
 * `disable` ：設定下次開機時不會被啟動
 * `status` ：目前狀態，會列出有沒有正在執行、開機預設執行否、登錄等資訊等
 * `is-active` ：目前是否運作中
 * `is-enabled` ：開機時是否啟用

## journalctl

用來檢索 systemd 的 log。

 * `--since`、`--until` ：過濾時間。
 * `-u` ：指定 service。
 * `-n` ：指定最新的幾筆。
 * `-f` ：相當於 `tail`。
 * `-p` ：過濾訊息，priority 分為：

    ```
    0: emerg
    1: alert
    2: crit
    3: err
    4: warning
    5: notice
    6: info
    7: debug
    ```

### Configuration

設定檔位於 [`/etc/systemd/journald.conf`](http://man7.org/linux/man-pages/man5/journald.conf.5.html) 。

 * `Storage` ：預設是 volatile，存在 memory，persistent 則會寫進 `/var/log/journal` 。

## launchctl

Mac 使用 launchctl 來管理系統中的 Process、Application 及 Script。透過 `*.plist` 檔案得知有哪些東西需要管理，所以若要新增任務給 Launchd，我們要新增一個 plist 檔案。檔案建議放在 `~/Library/LaunchAgents` 。

 * `load` ：載入
 * `unload` ：移除
 * `start` ：手動執行
 * `list` ：列表

## 參考資料

 * [認識系統服務 (daemons) / 鳥哥的 Linux 私房菜](http://linux.vbird.org/linux_basic/0560daemons.php)
 * [journalctl / man page](http://man7.org/linux/man-pages/man1/journalctl.1.html)