本文將比較 linux 中 service 和 systemctl 命令,先分別簡單介紹這兩個命令的基礎用法,然后進行比較。
從 centos 7.x 開始,CentOS 開始使用 systemd 服務來代替 service服務(daemon),原來管理系統啟動和管理系統服務的相關命令全部由 systemctl命令來代替。
一、service 命令
service命令是Redhat Linux兼容的發行版中用來控制系統服務的實用工具,它以啟動、停止、重新啟動和關閉系統服務,還可以顯示所有系統服務的當前狀態。
語法: service < option > | --status-all | [ service_name [ command | --full-restart ] ]
option 的值:
- -h:顯示 service 的幫助信息
- -status:顯示所服務的狀態
- --status-all:查看所有服務的狀態
- service_name:服務名,即 /etc/init.d 目錄下的腳本文件名
- command:系統服務腳本支持的控制命令,如:start、stop 和 restart
- --full-restart:重啟所有服務
可以理解成 service 就是init.d 的一種實現方式。
所以這兩者啟動方式(或者是停止、重啟)并沒有什么區別。
$ sudo /etc/init.d/Nginx start
// 等價于
$ service nginx start
這種方式有如下缺點:
- 啟動時間長。init 進程是串行啟動,只有前一個進程啟動完,才會啟動下一個進程。
- 啟動腳本復雜。init進程只是執行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這往往使得腳本變得很長。
查看所有的服務狀態:
[root@centos-160 ~]# service --status-all
/var/run/clickhouse-server/clickhouse-server.pid file exists and contains pid = 1192.
The process with pid = 1192 is running.
顯示系統當前的clickhouse進程狀態,可以看到pid是一致的。
[root@centos-160 ~]# ps -ef | grep clickhouse
clickho+ 935 1 0 08:58 ? 00:00:00 clickhouse-watchdog --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid
clickho+ 1192 935 3 08:58 ? 00:00:03 /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid
root 1698 1661 0 08:59 pts/0 00:00:00 grep --color=auto clickhouse
二、systemctl 命令
在較新的linux系統上,都使用systemd 取代了init,成為系統的第一個進程(PID 等于 1),其他進程都是它的子進程。systemd為系統啟動和管理提供了完整的解決方案。它提供了一組命令。字母d是守護進程(daemon)的縮寫。
查看systemd 的版本:
[root@centos-160 ~]# systemctl --version
systemd 239 (239-45.el8)
+PAM +AUDIT +SELINUX +IMA -AppARMOR +SmacK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy
列出所有服務(包括啟用和禁用):
# systemctl list-unit-files --type=service
systemd 的優點是功能強大,使用方便;缺點是體系龐大,非常復雜。事實上,現在還有很多人反對使用 systemd,理由就是它過于復雜,與操作系統的其他部分強耦合,違反 “keep simple, keep stupid” 的Unix 哲學。
三、service 與 systemctl 命令對比
下面是service和systemctl命令格式對比: