baicai

白菜

一个勤奋的代码搬运工!

Ubuntu使用systemd配置開機運行service

systemd#

Systemd 是 Linux 系統工具,用來啟動守護進程,已成為大多數發行版的標準配置。

由來#

歷史上,Linux 的啟動一直採用 init 進程。

下面的命令用來啟動服務。

    $ sudo /etc/init.d/apache2 start
    # 或者
    $ service apache2 start

這種方法有兩個缺點。

一是啟動時間長。init 進程是串行啟動,只有前一個進程啟動完,才會啟動下一個進程。

二是啟動腳本複雜。init 進程只是執行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這往往使得腳本變得很長。

Systemd 概述#

Systemd 就是為了解決這些問題而誕生的。它的設計目標是,為系統的啟動和管理提供一套完整的解決方案。

根據 Linux 慣例,字母 d 是守護進程(daemon)的縮寫。 Systemd 這個名字的含義,就是它要守護整個系統。

使用了 Systemd,就不需要再用 init 了。Systemd 取代了 initd,成為系統的第一個進程(PID 等於 1),其他進程都是它的子進程。

    $ systemctl --version

上面的命令查看 Systemd 的版本。

使用 systemd 實現開機執行 Shell 腳本#

通用操作步驟#

創建希望開機馬上執行的腳本,本文舉例腳本存放位置為 /home/navxin/Example/startup.sh,腳本內容如下:

#!/bin/bash
# 開機時在腳本的同級目錄下創建一個名為 StartupTouch.txt 的文件
touch /home/navxin/Example/startup.sh.txt

開機執行的腳本需增加可執行權限才能被 systemd 運行,使用如下命令#

chmod u+x /home/navxin/Example/startup.sh
chmod g+x /home/navxin/Example/startup.sh

進入 systemd 放置 service 的目錄,在該目錄下可看到大量服務配置文件,命令如下#

# 進入 systemd 的 service 目錄
cd /usr/lib/systemd/system
# 查看文件列表
ls -al
在該目錄創建一個新的 .service 文件用於配置開機啟動腳本,本例中的文件名為 StartupExample.service,所執行命令和文件中的配置內容如下:

創建服務配置文件#

sudo touch /usr/lib/systemd/system/StartupExample.service

以下為 StartupExample.service 配置文件的內容

[Unit]
Description=Startup Example

[Service]
ExecStart=/home/navxin/Example/startup.sh

[Install]
WantedBy=multi-user.target

嘗試手動運行新創建的 service,使用如下命令:#

# 手動運行 StartupExample.service
sudo systemctl start StartupExample.service
# 查看運行日誌
systemctl status StartupExample.service
    # 刪除剛測試服務時創建的文件
    rm -f /home/navxin/Example/startup.sh.txt
    # 設置服務為 enable 狀態,使之能開機運行
    sudo systemctl enable StartupExample.service
    # 重啟機器
    systemctl reboot

附註:Unit#

Systemd 可以管理所有系統資源。不同的資源統稱為 Unit(單位)。

Unit 一共分成 12 種。

    Service unit:系統服務
    Target unit:多個 Unit 構成的一個組
    Device Unit:硬件設備
    Mount Unit:文件系統的掛載點
    Automount Unit:自動掛載點
    Path Unit:文件或路徑
    Scope Unit:不是由 Systemd 啟動的外部進程
    Slice Unit:進程組
    Snapshot Unit:Systemd 快照,可以切回某個快照
    Socket Unit:進程間通信的 socket
    Swap Unit:swap 文件
    Timer Unit:定時器

systemctl list-units 命令可以查看當前系統的所有 Unit 。

    # 列出正在運行的 Unit
    $ systemctl list-units

    # 列出所有Unit,包括沒有找到配置文件的或者啟動失敗的
    $ systemctl list-units --all

    # 列出所有沒有運行的 Unit
    $ systemctl list-units --all --state=inactive

    # 列出所有加載失敗的 Unit
    $ systemctl list-units --failed

    # 列出所有正在運行的、類型為 service 的 Unit
    $ systemctl list-units --type=service

    # 列出所有正在運行的、類型為  mount 的 Unit
    $systemctl list-units --type=mount

    # 命令用於列出所有配置文件。
    $systemctl list-unit-files
    $systemctl list-unit-files --type=mount

修改 myadmin.service 文件,增加語句

    After=network-online.target remote-fs.target nss-lookup.target navxin-kn1.mount
    Wants=network-online.target

全部文件內容如下 (部分內容參考 nginx.service):

    # /lib/systemd/system/myadmin.service
    [Unit]
    Description=Start myAdmin web server
    Documentation=https://www.lyhuilin.com/
    After=network-online.target remote-fs.target nss-lookup.target navxin-kn1.mount
    Wants=network-online.target

    [Service]
    Environment="WELCOME=Baicai myAdmin Base Environment."
    ExecStartPre=/bin/echo ${WELCOME}
    ExecStart=/baicai/systemdStart/my_admin/my_admin -c /baicai/systemdStart/my_admin/conf/config.yaml
    ExecStop=/bin/kill -s TERM ${MAINPID}

    [Install]
    WantedBy=multi-user.target

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。