初识Systemd
前言
依Linux系統慣例,帶字母d的一般為守護進程(daemon),Systemd即為System Daemon,是Linux下的一款系統和服務管理器,用于取代傳統的Init組件。
Systemd功能強大,諸如Gnome桌面、用戶登錄管理、網絡服務都已集成其中,甚至后續udev也要加入Systemd的"豪華套餐"。不過開源社區對于Systemd則是充滿了爭議:有人認為它有利于Linux系統標準化;有人則認為它管的太多——不符合UNIX
“keep simple, keep stupid"的設計哲學,總之是有褒有貶。而現在,越來越多的Linux發行版(如SUSE、RedHat、CentOS、Ububtu等)都開始使用Systemd,大勢所趨,Systemd在爭議之中竟有一統Linux發行版之勢。
作為一個開發為主,順便學學運維的小蝦米,我接觸Systemd的目的是為了實現一個腳本開機自啟動的功能,至于其他的"是是非非”,自有肉食者謀,這里便不過多評價。
單元、服務與配置文件
Systemd由許多單元(Unit)組成,例如我們熟悉的SSH、Samba、Firewall等服務(Service),都由與之相關的Systemd單元進行管理。
Systemd單元有許多類型,不僅有管理服務的單元,還有管理其他系統資源的單元(如socket、系統設備、掛載點、文件系統等)。
要了解一個單元,最直觀的方式就是查看它的配置文件,以SSH為例,在Systemd中由單元sshd.service管理,執行以下命令可以查看配置文件內容:
$ systemctl cat sshd.serviceSSH配置文件:
[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 Type=simple KillMode=process Restart=on-failure RestartSec=42s[Install] WantedBy=multi-user.target可以看到,配置文件分成幾個區塊,每個區塊包含若干條字段組成的鍵值對,下面對解上述配置文件中幾個關鍵字段的含義進行解釋:
- Description
當前服務的簡單描述 - After
啟動順序(與之對應還有Before),表示sshd.service在network.target與sshd-keygen.service之后啟動 - ExecStart
啟動命令,定義服務啟動時執行的命令 - ExecReload
重載命令,定義服務重載時執行的命令 - Type
啟動類型,下表列出了幾種常見的類型
| simple | 默認值, 表示啟動的服務為主進程 |
| oneshot | 類似于simple,只執行一次,Systemd等待執行完畢后才啟動其他服務 |
| forking | 以fork()方式啟動,父進程退出,子進程成為主進程 |
- WantedBy
表示服務所在的Target
Target也是一種Systemd單元,可以理解為服務組,即一系列服務的集合
實現一個開機自啟動服務
初步了解單元與配置文件后,我們就可以通過Systemd實現一個開機自啟動的服務了。例如現有一個程序MyProgram位于目錄/home下,欲使其開機自啟動,步驟如下:
1. 新增自定義服務
在/usr/lib/systemd目錄下新增配置文件MyProgram.service,如下:
2. 使能新增的服務
執行如下命令:
根據配置文件中字段WantedBy的值,該命令將在目錄/etc/systemd/system/multi-user.target下創建文件MyProgram.service的軟鏈接。
3. 查看運行狀態
如此操作后,系統將在啟動后執行程序MyProgram,執行如下命令查看服務的運行狀態
4. 去使能新增的服務
如果想取消開機啟動MyProgram,則需執行以下命令:
參考:
總結
- 上一篇: K-means算法的Java实现 聚类分
- 下一篇: 修身格言