認識背景執行 Daemon 與手動建立 Service入門

Daemon 是什麼

Daemon 直接翻譯,意思為 “守護程序, 惡魔, 魔鬼, 妖魔”。

在這裡會解釋什麼是 Daemon ,以及基本的一些用法。

在系統中,都會依照需求安裝許多服務,但這些服務本身並不會自動啟用,針對啟用服務程序,即稱為 Daemon。

(其實,通常溝通方式都是說:“請幫忙啟動某個服務”。基本上不太會去區分 service 與 daemon,不太會強調背景執行 daemon 這件事情,因為,除非你有特殊需求,否則背景執行應該視為理所當然)。

因此 Linux Daemon 是指背景執行中的服務程序。

Service 與 Ports

在環境所安裝的多數服務,都會有習慣使用的 ports,例如 ```http

CVT2HUGO: 80/tcp, http 80/udp, fpt 21/tcp, ftp 21/udp``` 這些都會透過 ```/etc/services```
vim /etc/services

CVT2HUGO: 這個檔案先預設好。

通常,這些預設的網路通訊協定 Daemon,對應的Port,以及封包類型,都不建議變更。

Daemon 啟動類別

Daemon 啟動可分成兩種

(1) 獨立啟動 - stand along

獨立啟動的 Daemon 在啟用後,會持續運行,回應速度較快,但是就會持續佔用一定的資源,常見用於網路服務。

在多數 Unix Like 的環境,啟動的 script 都會放在 /etc/init.d/

(2) 統一啟動 - super daemon

統一啟動類別,需要統一由某個 Daemon 來調控服務,這些服務在流量低的時候,會自動切換到睡眠模式,當服務被呼叫時才會在啟動,因此較不會佔用資源,常見用於 ftp 這類服務。

通常,super daemon 啟動 script 會以/etc/xinetd.conf作為設定檔及放置於 CVT2HUGO: 。

備註: Service後面附加的的"d"是什麼意思?

在 Linux 服務開發者,在開發服務時都會依照慣例加上 “d”,這個 “d” 就是 “Daemon”,例如 httpd, CVT2HUGO: /etc/xinetd.d CVT2HUGO: supervisord。 CVT2HUGO: 目錄

啟動一個 Daemon

啟動 Daemon 的方式有幾種,以 syslogd

(1) /etc/init.d/

例如,透過以下指令來啟用 syslogd CVT2HUGO: 為例:

CVT2HUGO: Daemon
/etc/init.d/syslog start

(2) service

透過 service 啟用 syslogd

CVT2HUGO: Daemon,其實 service 也是透過 ```/etc/init.d/```
service syslog start

CVT2HUGO: 路徑來啟動

(3) systemctl

透過 systemctl 啟用 syslogd

CVT2HUGO: Daemon,其實 systemctl 也是透過 ```/etc/init.d/```
systemctl start syslog

CVT2HUGO: 路徑來啟動

Daemon 服務參數

啟動,關閉,重新啟動,目前運行狀態,相關指令參數如下:

# 啟動
service syslog start

# 關閉
service syslog stop

# 重新啟動
service syslog restart

# 目前狀態
service syslog status

如何自訂義一個 Daemon

首先,在啟動 Daemon 位置新增一個腳本

vim /etc/init.d/myservice

設定腳本內容

#!/bin/sh
# chkconfig: [runlevels] [start number] [stop number]
#chkconfig: 35 80 70
#description: myservice start

echo "Hello My Service";

設定腳本為可執行

chmod u+x /etc/init.d/myservice

重新載入 service

systemctl daemon-reload

將服務設定開機自動執行

chkconfig myservice on

查看 /etc/rc.d/

find /etc/rc.d/ -type l | grep 'myservice'

最後,移除服務方式:

chkconfig --del myservice
rm -rf /etc/init.d/myservice

如何自訂義 Service

這裡說明如何自訂義 Service 以及讓 Daemon service 啟用後,可自動重新啟動

其實,有點類似 /etc/init.d

首先,建立執行腳本

CVT2HUGO: 底下的設定腳本。
vim /etc/systemd/system/mydaemon.service
[Unit]
Description=my daemon

[Service]
Type=simple
WorkingDirectory=/usr/local/
#ExecStart=/usr/local/go/bin/go run src/mydaemon/main.go
ExecStart=/usr/local/bin/mydaemon
Restart=always

[Install]
WantedBy=multi-user.target

重新載入 service

systemctl daemon-reload

透過 systemctl 預設的方法,實現 開機自動啟動/取消開機自動啟動

# 開機自動啟動
systemctl enable example.service

# 取消開機自動啟動
systemctl disable example.service

如何查看執行中的 Daemon

查看系統運行中的Daemon ,通常會透過 pstop指令來觀察,執行所列出運行中的程序,多數都會是

CVT2HUGO: Daemon。
>ps aux

>top

跟網路有關的服務則會通過 netstat

CVT2HUGO: 來查看。
#列出目前啟用的網路服務
netstat -ntlp

#列出有問題的連線,可以用 kill 殺除
netstat -anp