1. 開機啟動
對於支持 systemd 的軟件,如果想要設置開機啟動,就執行如下命令(以 http 為例):
systemctl enable httpd
上面的命令相當於在 /etc/systemd/system/ 目錄里添加了一個符號鏈接,指向 /usr/lib/systemd/system/ 里面的 httpd.service 文件。
這是因為開機時,Systemd 只執行 /etc/systemd/system/ 目錄里面的配置文件。這也就意味着,將修改后的配置文件放在這里目錄里,就可以達到覆蓋原始配置的效果。
2. 啟動服務
啟動服務使用如下命令:
systemctl start httpd
執行完上面的命令,使用 systemctl status httpd 查看:
[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.
說明:
(1)Loaded行:配置文件的位置,是否設為開機啟動;
(2)Active行:表示正在運行;
(3)Main行:主進程PID;
(4)Status行:由應用本身提供的軟件當前狀態;
(5)CGroup行:應用的所有子進程
(6)日志塊:應用的日志
3. 停止服務
停止正在運行服務,命令如下:
systemctl stop httpd
有時候,程序沒有響應了,使用 systemctl stop 停不下來,這時候就需要 發送 kill 信號:
systemctl kill httpd
此外,重啟服務
systemctl restart httpd
4. service 配置文件
一個服務怎么啟動,完全由它的配置文件決定。
配置文件主要目錄:
/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 - 圖形界面模式
5. 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
6. 修改配置文件后重啟
修改配置文件以后,需要重新加載配置文件,然后重啟相關服務。
# 重新加載配置文件 systemctl daemon-reload # 重啟相關服務 systemctl restart sshd
參考鏈接:
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html