Ubuntu service管理

  • 16.04轉用了systemd來對系統服務提供管理和控制。

添加一個服務(service)

  • 添加一個服務,需要創建一個服務的定義檔放在 /lib/systemd/system 目錄下,這裡以 nginx.service 為例.
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target
  • 創建了這個檔後,還無法直接使用,必需先重載systemd的配置清單。
systemctl daemon-reload
# 這個是列舉所有已經存在設定檔對應的服務狀態清單
systemctl list-unit-files | grep nginx
# 列舉出具有載入狀態的服務清單(或者理解為最近被使用的服務)
systemctl --all | grep nginx
  • 如果習慣了使用 service 指令,可以繼續使用,和過去不同,現在不再需要在 /etc/init.d 目錄下添加一個服務腳本了。

  • 不過 systemctl (包括 service )執行以後,是沒有任何特別提示,除非碰到了錯誤資訊,否則都是靜默的,也許這是為了配合 bash 腳本的設計需求。

service nginx start
service nginx stop
service nginx reload
service nginx restart
service nginx status

# 但實際上Ubuntu的Wiki上推薦改用:
systemctl start nginx
systemctl start nginx.service
systemctl stop nginx
systemctl reload nginx
systemctl restart nginx
systemctl status nginx

啟動/禁用系統自啟動服務

  • 要將一個服務啟動為系統啟動時的自啟動服務,現在只要執行以下命令:
systemctl enable nginx.service (.service可省略如下)
systemctl enable nginx
  • 要禁用自啟動,只要disable即可。
systemctl disable nginx.service
systemctl disable nginx
  • 使用is-enabled來檢查服務是否已經啟動了自啟動
systemctl is-enabled nginx
# enabled/disabled
  • is-active檢查一個服務是否啟動:
systemctl is-active nginx
# active/inactive
  • is-failed判斷服務是否正常:
systemctl is-failed application.service
  • 列出系統所有服務
systemctl list-units

# 列出系統中所有沒有啟動的服務
systemctl list-units --all --state=inactive

關於 /etc/init 目錄

  • 這個目錄,其實未必真的需要添加進一個相關的控制進程啟動的設定檔,這裡添加的檔,和具體的服務啟動沒有具體的關聯性,新版本的 service 設定檔,實際上已經明確了啟動服務所需的必要服務和之後載入的服務。

  • /etc/init 目錄下存放的,可以理解為一個綜合性啟動的腳本配置,他支援在設定檔中,使用bash代碼塊。

  • 可以理解為,對過去的啟動腳本更簡化版的一個啟動設定檔,使用這個設定檔控制啟動,還是使用 systemd 自行控制服務作為自啟動,這個交給使用者去權衡吧。

results matching ""

    No results matching ""