linux 系統進程管理工具systemd詳解(systemctl命令、創建自己的systemd服務)
目錄
- linux systemd
- 什么是 systemd
- systemd 特點
- unit(單元)
- systemd unit目錄
- Unit 和 Target
- Unit 文件結構
- Linux命令——systemctl
- 參考
linux systemd
什么是 systemd
Linux 系統在啟動過程中,內核完成初始化以后,由內核第一個啟動的程序便是 init 程序,路徑為 /sbin/init(為一個軟連接,鏈接到真實的 init 進程),其 PID 為1,它為系統里所有進程的“祖先”,Linux 中所有的進程都由 init 進程直接或間接進行創建并運行,init 進程以守護進程的方式存在,負責組織與運行系統的相關初始化工作,讓系統進入定義好的運行模式,如命令行模式或圖形界面模式。
Systemd(系統管理守護進程),最開始以GNU GPL協議授權開發,現在已轉為使用GNU LGPL協議,它是如今討論最熱烈的引導和服務管理程序。如果你的Linux系統配置為使用Systemd引導程序,它取替傳統的SysV init,啟動過程將交給systemd處理。Systemd的一個核心功能是它同時支持SysV init的后開機啟動腳本。
systemd是目前Linux系統上主要的系統守護進程管理工具,由于init一方面對于進程的管理是串行化的,容易出現阻塞情況,另一方面init也僅僅是執行啟動腳本,并不能對服務本身進行更多的管理。所以從CentOS 7開始也由systemd取代了init作為默認的系統進程管理工具。
systemd 是內核啟動后的第一個用戶進程,PID 為1,是所有其它用戶進程的父進程。
systemd 特點
- 最新系統都采用systemd管理(RedHat7,CentOS7,Ubuntu20.04…)
- CentOS7 支持開機并行啟動服務,顯著提高開機啟動效率
- CentOS7關機只關閉正在運行的服務,而CentOS6,全部都關閉一次。
- CentOS7服務的啟動與停止不再使用腳本進行管理,也就是/etc/init.d下不在有腳本。
- CentOS7使用systemd解決原有模式缺陷,比如原有service不會關閉程序產生的子進程
unit(單元)
系統初始化需要做的事情非常多。需要啟動后臺服務,比如啟動 ssh 服務;需要做配置工作,比如掛載文件系統。這個過程中的每一步都被 systemd 抽象為一個配置單元,即 unit。可以認為一個服務是一個配置單元,一個掛載點是一個配置單元,一個交換分區的配置是一個配置單元等等。
下面是一些常見的 unit 類型:
- service :代表一個后臺服務進程,比如 MySQLd。這是最常用的一類。
- socket :此類配置單元封裝系統和互聯網中的一個套接字 。當下,systemd 支持流式、數據報和 連續包的 AF_INET、AF_INET6、AF_UNIX socket 。每一個套接字配置單元都有一個相應的服務配置單元 。相應的服務在第一個"連接"進入套接字時就會啟動(例如:nscd.socket 在有新連接后便啟動 nscd.service)。
- device :此類配置單元封裝一個存在于 Linux 設備樹中的設備。每一個使用 udev 規則標記的設備都將會在 systemd 中作為一個設備配置單元出現。
- mount :此類配置單元封裝文件系統結構層次中的一個掛載點。Systemd 將對這個掛載點進行監控和管理。比如可以在啟動時自動將其掛載;可以在某些條件下自動卸載。Systemd 會將 /etc/fstab 中的條目都轉換為掛載點,并在開機時處理。
- automount :此類配置單元封裝系統結構層次中的一個自掛載點。每一個自掛載配置單元對應一個掛載配置單元 ,當該自動掛載點被訪問時,systemd 執行掛載點中定義的掛載行為。
- swap:和掛載配置單元類似,交換配置單元用來管理交換分區。用戶可以用交換配置單元來定義系統中的交換分區,可以讓這些交換分區在啟動時被激活。
- target :此類配置單元為其他配置單元進行邏輯分組。它們本身實際上并不做什么,只是引用其他配置單元而已。這樣便可以對配置單元做一個統一的控制。這樣就可以實現大家都已經非常熟悉的運行級別概念。比如想讓系統進入圖形化模式,需要運行許多服務和配置命令,這些操作都由一個個的配置單元表示,將所有這些配置單元組合為一個目標(target),就表示需要將這些配置單元全部執行一遍以便進入目標所代表的系統運行狀態。 (例如:multi-user.target 相當于在傳統使用 SysV 的系統中運行級別 5)
- timer:定時器配置單元用來定時觸發用戶定義的操作,這類配置單元取代了 atd、crond 等傳統的定時服務。
- snapshot :與 target 配置單元相似,快照是一組配置單元。它保存了系統當前的運行狀態。
- path:文件系統中的一個文件或目錄。
- scope:用于 cgroups,表示從 systemd 外部創建的進程。
- slice:用于 cgroups,表示一組按層級排列的單位。slice 并不包含進程,但會組建一個層級,并將 scope 和 service 都放置其中。
**每個配置單元都有一個對應的配置文件,系統管理員的任務就是編寫和維護這些不同的配置文件,比如一個 MySQL 服務對應一個 mysql.service 文件。**
- .automount:用于控制自動掛載文件系統,相當于 SysV-init 的 autofs 服務
- .device:對于 /dev 目錄下的設備,主要用于定義設備之間的依賴關系
- .mount:定義系統結構層次中的一個掛載點,可以替代過去的 /etc/fstab 配置文件
- .path:用于監控指定目錄或文件的變化,并觸發其它 Unit 運行
- .scope:這種 Unit 文件不是用戶創建的,而是 Systemd 運行時產生的,描述一些系統服務的分組信息
- .service:封裝守護進程的啟動、停止、重啟和重載操作,是最常見的一種 Unit 文件
- .slice:用于表示一個 CGroup 的樹,通常用戶不會自己創建這樣的 Unit 文件
- .snapshot:用于表示一個由 systemctl snapshot 命令創建的 Systemd Units 運行狀態快照
- .socket:監控來自于系統或網絡的數據消息,用于實現基于數據自動觸發服務啟動
- .swap:定義一個用戶做虛擬內存的交換分區
- .target:用于對 Unit 文件進行邏輯分組,引導其它 Unit 的執行。它替代了 SysV-init 運行級別的作用,并提供更靈活的基于特定設備事件的啟動方式
- .timer:用于配置在特定時間觸發的任務,替代了 Crontab 的功能
systemd unit目錄
Unit 文件按照 Systemd 約定,應該被放置指定的三個系統目錄之一中。這三個目錄是有優先級的,如下所示,越靠上的優先級越高。因此,在三個目錄中有同名文件的時候,只有優先級最高的目錄里的那個文件會被使用。
/etc/systemd/system:系統或用戶自定義的配置文件 /run/systemd/system:軟件運行時生成的配置文件 /usr/lib/systemd/system:系統或**第三方軟件安裝時添加的配置文件**。
Systemd 默認從目錄 /etc/systemd/system/ 讀取配置文件。但是,里面存放的大部分文件都是符號鏈接,指向目錄 /usr/lib/systemd/system/,真正的配置文件存放在那個目錄。
Unit 和 Target
Target 就是一個 Unit 組,包含許多相關的 Unit 。
Unit 是 Systemd 管理系統資源的基本單元,可以認為每個系統資源就是一個 Unit,并使用一個 Unit 文件定義。在 Unit 文件中需要包含相應服務的描述、屬性以及需要運行的命令。
Unit 文件結構
systemd.service 中文手冊
參考URL:
每一個服務以.service結尾,一般會分為3部分:[Unit]、[Service]和[Install]
- [Unit]:記錄unit文件的通用信息。
- [Service]:記錄Service的信息
- [Install]:安裝信息。
把自己的服務使用systemd管理需要書寫*.service文件,如服務名xxx.service,下面我們介紹一下*.service文件里面具體的內容。
進入目錄 cd /etc/systemd/system/
cat << EOF > /etc/systemd/system/xxx.service [Unit] Description=Xxx Service Documentation=https://www.secureweb3.com/ After=network-online.target Wants=network-online.target [Service] User=root CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE NoNewPrivileges=true ExecStart=+$APPROOT/xxx Restart=on-failure RestartPreventExitStatus=23 [Install] WantedBy=multi-user.target EOF
- Description:描述這個 Unit 文件的信息
- Documentation:指定服務的文檔,可以是一個或多個文檔的 URL 路徑
- Requires:依賴的其它 Unit 列表,列在其中的 Unit 模板會在這個服務啟動時的同時被啟動。并且,如果其中任意一個服務啟動失敗,這個服務也會被終止
- Wants:與 Requires 相似,但只是在被配置的這個 Unit 啟動時,觸發啟動列出的每個 Unit 模塊,而不去考慮這些模板啟動是否成功
- After:與 Requires 相似,但是在后面列出的所有模塊全部啟動完成以后,才會啟動當前的服務
- network-online.target是主動等待直到網絡“啟動”的target,其中“啟動”的定義
network.target代表有網路,network-online.target代表一個連通著的網絡。
[service]
- User: 指定用戶運行CapabilityBoundingSet: 能力邊界設置,可以設置哪些能力
- capability
美: [?ke?p??b?l?ti]
英: [.ke?p?’b?l?ti]
n. 能力;才能;(國家的)軍事力量
網絡 性能;容量;才干
bound
美: [ba?nd]
英: [ba?nd]
n. 邊界;跳躍;范圍;界限
v. 跳躍;鄰接;“bind”的過去分詞和過去式;限制
adj. 打算;要往(某處)去的;被束縛的;理應…的
網絡 彈跳;邊邊界框;彈跳力
CAP_NET_ADMIN
執行各種與網絡相關的操作:
* 接口配置;
* 管理 IP 防火墻、偽裝和
會計;
* 修改路由表;
*綁定到任何地址以進行透明代理;
* 設置服務類型 (TOS);
* 清除驅動程序統計信息;
* 設置混雜模式;
*啟用多播;
* 使用setsockopt(2)設置以下套接字選項:
SO_DEBUG、SO_MARK、SO_PRIORITY(對于優先級外
范圍 0 到 6)、SO_RCVBUFFORCE和SO_SNDBUFFORCE。
CAP_NET_BIND_SERVICE 將套接字綁定到 Internet 域特權端口(端口 小于 1024 的數字)。
- NoNewPrivileges=true
- ExecStart: 定義啟動進程時執行的命令
- Restart= 設為on-failure, on-watchdog, on-abnormal, always 之一, 可以實現在失敗狀態下的自動重啟該服務。
- RestartPreventExitStatus中列出的退出碼或者信號永遠不會導致該服務被重啟。
[Install]
- WantedBy字段:表示該服務所在的 Target。
Target的含義是服務組,表示一組服務。WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target。
這個設置非常重要,因為執行systemctl enable sshd.service命令時,sshd.service的一個符號鏈接,就會放在/etc/systemd/system目錄下面的multi-user.target.wants子目錄之中。
一般來說,常用的 Target 有兩個:一個是multi-user.target,表示多用戶命令行狀態;另一個是graphical.target,表示圖形用戶狀態,它依賴于multi-user.target。
Linux命令——systemctl
Systemd 入門教程:實戰篇
參考URL: https://www.jb51.net/article/269756.htm
Linux命令——systemctl
參考URL:https://www.jb51.net/article/269756.htm
systemd對應的進程管理命令就是systemctl。
systemctl [command] [unit](配置的應用名稱) command可選項· start:啟動指定的unit systemctl start nginx stop:關閉指定的unit systemctl stop nginx restart:重啟指定unit systemctl restart nginx reload:重載指定unit systemctl reload nginx enable:系統開機時自動啟動指定unit,前提是配置文件中有相關配置 systemctl enable nginx disable:開機時不自動運行指定unit systemctl disable nginx status:查看指定unit當前運行狀態 systemctl status nginx
參考
Systemd 入門教程:實戰篇
參考URL: https://www.jb51.net/article/269756.htm
到此這篇關于linux 系統進程管理工具systemd詳解(systemctl命令、創建自己的systemd服務)的文章就介紹到這了,更多相關linux 進程管理工具systemd內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!
![Tomcat啟動報錯:嚴重: Unable to process Jar entry [module-info.class]](http://www.aoyou183.cn/attached/image/news/202309/1807483457.png)