1、Systemd 服務簡介 Systemd 是 Linux 下的一種 init 軟件,其開發目標是提供更優秀的框架以表示系統服務間的依賴關系,并以此實現系統初始化時,服務的并行啟動,同時達到降低 Shell 系統開銷的效果。它融合之前 service 和chkconfig 的功能于一體。可以使用它永久性或只在當前會話中啟用/禁用服務。 內核啟動完成后,傳統的的啟動首先執行的第一個進程是/sbin/init。如果要以 systemd 方式啟動,首先讓內核執行的第一個程序是/lib/systemd/system 或者/usr/lib/systemd/system。 啟動以后,首先會去三個目錄下找相應的配置文件,按優先級從高到低分別是/etc/systemd/usr/lib/systemd lib /lib/systemd/ 優先級高的配置文件會覆蓋優先級低的配置文件。 2、創建服務文件 服務文件格式一般如下所示: [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target [Unit] Description : 服務的簡單描述 Documentation : 服務文檔 Before、After:定義啟動順序。 Before=xxx.service,代表本服務在 xxx.service 啟動之前啟動。 After=xxx.service,代表本服務在 xxx.service 之后啟動。 Requires:這個單元啟動了,它需要的單元也會被啟動;它需要的單元被停止了,這個單元也停止了。 Wants:推薦使用。這個單元啟動了,它需要的單元也會被啟動;它需要的單元被停止了,對本單元沒 有影響。 [Sravi r] Type=simple(默認值):systemd 認為該服務將立即啟動。服務進程不會 fork。如果該服務要啟動其他 服務,不要使用此類型啟動,除非該服務是 socket 激活型。 Type=forking:systemd 認為當該服務進程 fork,且父進程退出后服務啟動成功。對于常規的守護進程 (daemon),除非你確定此啟動方式無法滿足需求,使用此類型啟動即可。使用此啟動類型應同時指定 PIDFile=,以便 systemd 能夠跟蹤服務的主進程。 Type=oneshot:這一選項適用于只執行一項任務、隨后立即退出的服務。可能需要同時設置 RemainAfterExit=yes 使得 systemd 在服務進程退出之后仍然認為服務處于激活狀態。 Type=notify:與 Type=simple 相同,但約定服務會在就緒后向 systemd 發送一個信號。這一通知的實 現由 libsystemd-daemon.so 提供。 Type=dbus:若以此方式啟動,當指定的 BusName 出現在 DBus 系統總線上時,systemd 認為服務就緒。 Type=idle: systemd 會等待所有任務(Jobs)處理完成后,才開始執行 idle 類型的單元。除此之外,其他行 為和 Type=simple 類似。 PIDFile:pid 文件路徑 ExecStart:指定啟動單元的命令或者腳本,ExecStartPre 和 ExecStartPost 節指定在 ExecStart 之前或者之 后用戶自定義執行的腳本。Type=oneshot 允許指定多個希望順序執行的用戶自定義命令。 ExecReload:指定單元停止時執行的命令或者腳本。 ExecStop:指定單元停止時執行的命令或者腳本。 PrivateTmp:True 表示給服務分配獨立的臨時空間 Restart:這個選項如果被允許,服務重啟的時候進程會退出,會通過 systemctl 命令執行清除并重啟的操作。 RemainAfterExit:如果設置這個選擇為真,服務會被認為是在激活狀態,即使所以的進程已經退出,默認的值為假,這個選項只有在 Type=oneshot 時需要被配置。 [Instwll] Alias:為單元提供一個空間分離的附加名字。 RequiredBy:單元被允許運行需要的一系列依賴單元,RequiredBy 列表從 Require 獲得依賴信息。 WantBy:單元被允許運行需要的弱依賴性單元,Wantby 從 Want 列表獲得依賴信息。 Also:指出和單元一起安裝或者被協助的單元。 DefaultInstance:實例單元的限制,這個選項指定如果單元被允許運行默認的實例。 3、操作服務 啟動服務 systemctl start test.service 關閉服務 systemctl stop test.service 重啟服務 systemctl restart test.service 顯示服務的狀態 systemctl status test.service 在開機時啟用服務 systemctl enable test.service 在開機時禁用服務 systemctl disable test.service 查看服務是否開機啟動 systemctl is-enabled test.service 查看已啟動的服務列表 systemctl list-unit-files|grep enabled 查看啟動失敗的服務列表 systemctl --failed 4、配置自啟動程序 本章節在此介紹一種使用 systemd 方式來配置任意開機自啟動程序的方法。 1.首先將 iMX8MM 開發板上電啟動,在開發板終端中進入到/home/root/目錄下,執行如下命令創建一個腳本文件: touch helloworld.sh ![]() 2.向 helloworld.sh 寫入自定義的命令,作者寫的命令如下所示,開機自動創建文件夾。 echo '#!/bin/sh mkdir -p /home/topeet/test ![]() 3.然后修改權限,輸入以下命令: chmod 777 /home/root/helloworld.sh ![]() 4.我們進入到“/lib/systemd/system/”目錄下,并新建一個 helloworld.service 文件,命令如下: cd /lib/systemd/system vi helloworld.service ![]() helloworld.service 文件的內容如下: [Unit] Description=helloworld After=basic.service X.service thermal-zone-init.service [Service] ExecStart=/home/root/helloworld.sh [Install] WantedBy=multi-user.target Description 需寫入服務名, ExecStart 需要寫入可執行文件的絕對路徑。然后保存文件并退出,如下圖所示: ![]() 5.然后我們在串口終端輸入以下命令 systemctl -f enable /lib/systemd/system/helloworld.service ![]() 6.此時即可將新添加的自啟動服務生效,重啟開發板后,此程序即可自動運行,查看是否生成了文件夾,如下圖所示: ![]() 7.如果您自定義的服務啟動不了,可以根據上一小節提供的方法查看服務的運行狀態,查找原因。 |