# Daemon 生命週期

本頁說明 `Start`、`Stop`、`Close` 在 server 模式與 client 模式下各自的行為。

## 生命週期

| 方法 | Server 模式 | Client 模式 |
|---|---|---|
| `Start()` | 不阻塞。重新探測，若另一個 daemon 回應則回傳 `ErrAlreadyRunning`；移除殘留 socket 檔、開始監聽並在 goroutine 中 accept。監聽中再次呼叫不做事 | 不做事 |
| `Stop()` | 關閉 listener、等待 accept 迴圈、關閉所有開啟的連線、等待連線 goroutine | 不做事 |
| `Close()` | `Stop()` 後 `Store.Close()`，錯誤合併回傳 | 關閉閒置連線 |
| `Mode()` / `Socket()` | `ModeServer` / socket 路徑 | `ModeClient` / socket 路徑 |
| `Store()` | 底層 `*store.Store` | `nil` |

Server 模式的 `Daemon` 在行程內分派呼叫，因此在 `Start()` 前自己的方法就能使用。`Stop()` 必須關閉存活連線，否則 client 連線池的閒置連線會讓 `serve()` 一直卡在 `readFrame`，`Stop()` 永遠回不來。

Server process 結束後 client 不會接手；它的呼叫會以撥號錯誤失敗，直到新的 `daemon.New` 選出新的 server。

## 相關頁面

- [模式判定](/zh/socket-daemon)
- [連線處理](/zh/socket-daemon-connections)
- [daemon](/zh/api-reference-daemon)
