對於支持 systemd 的軟件,若是想要設置開機啓動,就執行以下命令(以 http 爲例):html
systemctl enable httpd
上面的命令至關於在 /etc/systemd/system/ 目錄裏添加了一個符號連接,指向 /usr/lib/systemd/system/ 裏面的 httpd.service 文件。redis
這是由於開機時,Systemd 只執行 /etc/systemd/system/ 目錄裏面的配置文件。這也就意味着,將修改後的配置文件放在這裏目錄裏,就能夠達到覆蓋原始配置的效果。apache
啓動服務使用以下命令:vim
systemctl start httpd
執行完上面的命令,使用 systemctl status httpd 查看:bash
[root@localhost ~]# systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: active (running) since Sat 2019-06-15 10:49:35 CST; 2s ago Docs: man:httpd(8) man:apachectl(8) Process: 3253 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS) Main PID: 3258 (httpd) Status: "Processing requests..." CGroup: /system.slice/httpd.service ├─3258 /usr/sbin/httpd -DFOREGROUND ├─3259 /usr/sbin/httpd -DFOREGROUND ├─3260 /usr/sbin/httpd -DFOREGROUND ├─3261 /usr/sbin/httpd -DFOREGROUND ├─3262 /usr/sbin/httpd -DFOREGROUND └─3263 /usr/sbin/httpd -DFOREGROUND Jun 15 10:49:35 localhost.localdomain systemd[1]: Starting The Apache HTTP Server... Jun 15 10:49:35 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
說明:session
(1)Loaded行:配置文件的位置,是否設爲開機啓動;dom
(2)Active行:表示正在運行;ssh
(3)Main行:主進程PID;ui
(4)Status行:由應用自己提供的軟件當前狀態;spa
(5)CGroup行:應用的全部子進程
(6)日誌塊:應用的日誌
中止正在運行服務,命令以下:
systemctl stop httpd
有時候,程序沒有響應了,使用 systemctl stop 停不下來,這時候就須要 發送 kill 信號:
systemctl kill httpd
此外,重啓服務
systemctl restart httpd
一個服務怎麼啓動,徹底由它的配置文件決定。
配置文件主要目錄:
/usr/lib/systemd/system/ 和 /etc/systemd/system/
systemctl cat 命令能夠用來查看配置文件,以 sshd.service 爲例:
[root@localhost ~]# systemctl cat sshd # /usr/lib/systemd/system/sshd.service [Unit] Description=OpenSSH server daemon Documentation=man:sshd(8) man:sshd_config(5) After=network.target sshd-keygen.service Wants=sshd-keygen.service [Service] EnvironmentFile=/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
配置文件被分爲了三大塊,下面對每一個區塊內容進行說明:
(1)[Unit] 區塊:啓動順序與依賴關係
Unit 區塊的 Description 字段給出了當前服務的簡單描述,Documentation 字段給出文檔位置。
接下來就是 啓動順序 和 依賴關係
After 字段:表示若是network.target或sshd-keygen.service須要啓動,那麼sshd.service應該在它們以後啓動。
相應的,還有一個 Before 字段,定義 sshd.service 應該在哪些服務以前啓動。
注意,After 和 Before 字段只涉及啓動順序,不涉及依賴關係。
設置依賴關係,須要使用 Wants 字段和 Requires 字段。
Wants字段:表示sshd.service與sshd-keygen.service之間存在"弱依賴"關係,即若是"sshd-keygen.service"啓動失敗或中止運行,不影響sshd.service繼續執行。 Requires字段則表示"強依賴"關係,即若是該服務啓動失敗或異常退出,那麼sshd.service也必須退出。
注意:Wants 和 Rquires 字段只涉及依賴關係,與啓動順序無關,默認狀況下是同時啓動的。
(2)[Service] 區塊:啓動行爲
Service 區塊定義如何啓動當前服務。
2.1 啓動命令
許多軟件都有本身的環境參數文件,該文件能夠用 EnvironmentFile 字段讀取。
EnvironmentFile 字段:指定當前服務的環境參數文件。該文件內部的 key=value 鍵值對,能夠對 $key 的形式,在當前配置文件中獲取。
在 sshd.service 例子中, sshd 的環境參數文件是 /etc/sysconfig/sshd.
啓動腳本參數:
ExecStart 字段:定義啓動進程時執行的命令。
sshd 例子中,啓動的執行命令是: /usr/bin/sshd -D $OPTIONS,其中的 $OPTIONS 來自 EnvironmentFile字段指定的環境變量文件。
與之做用類似的,還有以下這些字段:
ExecReload字段:重啓服務時執行的命令 ExecStop字段:中止服務時執行的命令 ExecStartPre字段:啓動服務以前執行的命令 ExecStartPost字段:啓動服務以後執行的命令 ExecStopPost字段:中止服務以後執行的命令
下面編寫一個簡單的 testd.service 的例子:
[root@localhost ~]# vim /usr/lib/systemd/system/testd.service [Unit] Description=Test [Service] Type=oneshot ExecStart=/bin/echo start1 ExecStart= # 這裏設置了空值,意味着上面的賦值做廢 ExecStart=/bin/echo start3 ExecStart=/bin/echo start4 # 執行 testd 服務 [root@localhost ~]# systemctl start testd [root@localhost ~]# systemctl status testd ● testd.service - Test Loaded: loaded (/usr/lib/systemd/system/testd.service; static; vendor preset: disabled) Active: inactive (dead) Jun 15 12:45:17 localhost.localdomain systemd[1]: Starting Test... Jun 15 12:45:17 localhost.localdomain echo[3349]: start3 Jun 15 12:45:17 localhost.localdomain echo[3351]: start4 Jun 15 12:45:17 localhost.localdomain systemd[1]: Started Test.
經過 systemctl status testd 能夠獲得執行結果:
start3 start4
注意:在全部的啓動設置以前,均可以加上一個連詞號(-),表示「抑制錯誤」,即發生錯誤的時候,不影響其餘命令的執行。好比:
EnvironmentFile=-/etc/sysconfig/sshd
表示:即便 /etc/sysconfig/sshd 文件不存在,也不會拋出錯誤。
2.2 啓動類型
Type 字段定義啓動類型。它能夠設置的值以下:
simple(默認值):ExecStart字段啓動的進程爲主進程 forking:ExecStart字段將以fork()方式啓動,此時父進程將會退出,子進程將成爲主進程 oneshot:相似於simple,但只執行一次,Systemd 會等它執行完,才啓動其餘服務 dbus:相似於simple,但會等待 D-Bus 信號後啓動 notify:相似於simple,啓動結束後會發出通知信號,而後 Systemd 再啓動其餘服務 idle:相似於simple,可是要等到其餘任務都執行完,纔會啓動該服務。一種使用場合是爲讓該服務的輸出,不與其餘服務的輸出相混合
在上面的例子中,已經使用到了 oneshot 這種類型,對於某些只須要執行一次,執行完成後,進程就退出的服務,能夠採用這種類型。
2.3 啓動行爲
Service 區塊有一些字段,定義了重啓行爲。
KillMode字段:定義 Systemd 如何中止 sshd 服務。
在 sshd 例子中,將 KillMode 字段設置爲 process 表示只中止主進程,不中止任何 sshd 子進程,即子進程打開的 SSH session 仍然保持鏈接。這個設置不太常見,但對 sshd 很重要,不然你中止服務的時候,會將本身打開的 SSH session 一塊殺掉。
KillMode 字段的值能夠設置以下:
control-group(默認值):當前控制組裏面的全部子進程,都會被殺掉 process:只殺主進程 mixed:主進程將收到 SIGTERM 信號,子進程收到 SIGKILL 信號 none:沒有進程會被殺掉,只是執行服務的 stop 命令。
接下來是 Restart 字段。
Restart字段:定義了 sshd 退出後,Systemd 的重啓方式。
在 sshd 例子中,Restart 設爲 on-failure,表示任何意外的失敗,就將重啓 sshd。若是 sshd 正常中止(好比執行 systemctl stop 命令),它就不會重啓。
Restart 字段能夠設置的值以下:
no(默認值):退出後不會重啓 on-success:只有正常退出時(退出狀態碼爲0),纔會重啓 on-failure:非正常退出時(退出狀態碼非0),包括被信號終止和超時,纔會重啓 on-abnormal:只有被信號終止和超時,纔會重啓 on-abort:只有在收到沒有捕捉到的信號終止時,纔會重啓 on-watchdog:超時退出,纔會重啓 always:不論是什麼退出緣由,老是重啓
對於守護進程,推薦設爲 on-failure 對於那些容許發生錯誤退出的服務,能夠設置爲 on-abnormal
最後是 RestartSec 字段。
RestartSec字段:表示 Systemd 重啓服務以前,須要等待的秒數。上面的例子設爲等待42秒。
(3) [Install] 區塊
Install 區塊,定義如何安裝這個配置文件,即怎麼作到開機啓動。
WantedBy字段:表示該服務所在的 Target。
Target 的含義是服務組,表示一組服務。WantedBy=multiuser-target 指的是,sshd 所在的 Target 是 multi-user.target
這個設置很是重要,由於執行 sytemctl enable sshd.service 命令時,sshd.service 的一個符號連接,就會放在 /etc/systemd/system/multi-user.target.wants 子目錄中。
Systemd 有默認的啓動 Target
[root@localhost ~]# systemctl get-default multi-user.target
上面的結果表示,默認的啓動 Target 是 multi-user.target 。在這個組裏的全部服務,都將開機啓動,這就是爲何 systemctl enable 命令能設置開機啓動的緣由。
在使用 Target 時,systemctl list-dependencies 命令和 systemctl isolate 命令也頗有用。
# 查看multi-user.target 包含的全部服務 systemctl list-dependencies multi-user.target # 切換到另外一個 target systemctl isolate graphical.target
通常來講,經常使用的 target 就兩個:
1. multi-user.target - 多用戶命令行;
2. graphical.target - 圖形界面模式
Target 也有配置文件:
[root@localhost ~]# systemctl cat multi-user.target # /lib/systemd/system/multi-user.target # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. [Unit] Description=Multi-User System Documentation=man:systemd.special(7) Requires=basic.target Conflicts=rescue.service rescue.target After=basic.target rescue.service rescue.target AllowIsolate=yes
注意:Target 配置文件裏面沒有啓動命令。
Requires字段:要求 basic.target 一塊兒運行 Conflicts字段:衝突字段。若是 rescue.service 或 rescue.target 正在運行,multi-user.target 就不能運行,反之亦然。 After字段:表示multi-user.target 在 basic.target rescue.service rescue.target以後啓動,若是它們有啓動的話。 AllowIsolate字段:容許使用 systemctl isolate 命令切換到 multi-user.target
修改配置文件之後,須要從新加載配置文件,而後重啓相關服務。
# 從新加載配置文件 systemctl daemon-reload # 重啓相關服務 systemctl restart sshd
參考連接:
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html