由于这个学期学校有Linux课程,我也一直期待着这门课,为了练习在Linux上搭建一些应用,so 我把原来的Windows2012的云服务器换成了CentOS7(其实有很多其他原因,比如mstsc传输速度慢的可怕,而且服务器带宽本来就不行)。在学习过程中遇到了很多问题,主要在于很多Linux命令在CentOS7中有了替代品,也就是所谓的新特性,其中最“坑”的就是Systemd进程取代init进程(很多书籍资料讲的都是init作为启动进程)。这个主要体现在service
和chkconfig
命令上,在CentOS7中使用systemctl
代替service
和chkconfig
两个命令。
service命令
service命令本质上是/sbin
目录下的一个shell脚本,
是用来管理系统服务的,这个类似于windows上的sc命令和services.msc,准确的来说Linux上的服务应该叫守护进程(Daemon),这也是为什么Linux的服务程序后面都会加一个字母d(如httpd,sshd)。service命令用法如下:
1 | Usage: service <option> | |
- option参数主要是:-h ,–help,–version
- –status-all 参数是列出当前所有服务的状态
- 最后这种用法也是最常用的。
- service_name顾名思义是服务名,它主要指的是
/etc/init.d
目录下的服务脚本,事实上service脚本就是间接的去调用了该目录下的服务脚本,所以你也可以直接使用这些服务脚本进行服务的启动或关闭,比如/etc/init.d/sshd start
可以启动ssh服务 - command是对服务进行的一些操作,比如:start、stop、restart、status
下面这张图是Oracle Linux5中/etc/init.d目录下的服务脚本
chkconfig命令
chkconfig修改或查询系统服务在各种运行级别中系统开机时的开启|关闭状态,简单的说就是“开机自启动”的配置。
Linux开机启动的第一个进程就是init进程(init程序全路径为/sbin/init
),关于Linux“开机启动项”又有一大堆名堂了。首先要说的就是运行级别,运行级别在/etc/inittab
文件中有详细的描述(标准的Linux运行级别为3或5):
1 | 0 : 系统停机状态,系统默认运行级别不能设置为0,否则不能正常启动,机器关闭。 |
而/etc/rc.d
下有七个运行级别的启动项配置,也就是七个rc*.d目录
这7个目录下记录都是链接文件,这些链接文件以”K”或”S”打头,也就分别对应者这个运行级别下相应服务的“关闭”或“启动”。这些链接文件指向的是/etc/rc.d/init.d
目录下的shell脚本。事实上前面service命令中说道/etc/init.d
目录其实是一个链接文件,指向的就是/etc/rc.d/init.d
目录。
在网上找到这个比较容易理解的图,需要注意的是/etc/rc*.d
连接到了/etc/rc.d/rc*.d
;
chkconfig具体用法如下(“#”号后面是注释)
1 | usage: |
systemctl命令
说道systemctl命令就要说道Systemd这个守护进程了,Systemd是用来取代传统的开机进程init进程的,主要原因是init是串行启动,前一个服务进程启动完成后下一个服务进程才能启动,这也就导致了init进程启动耗时比较长。关于Systemd体系与init的比较。在维基百科中有这样一段描述:
与System V风格init相比,systemd采用了以下新技术:
- 将service(服务)、target(运行模式,类似于运行档次)、mount、timer、snapshot、path、socket、swap等称为Unit。比如,一个auditd服务(就是auditd.service)就是一个Unit,一个multi-user.target运行模式也是一个Unit。
- 采用Socket激活式与D-Bus激活式服务,以提高相互依赖的各服务的并行运行性能;
用cgroups代替进程ID来追踪进程,以此即使是两次fork之后生成的守护进程也不会脱离systemd的控制。 - 用target代替System V的运行级别(Runlevel),比如,SystemD的graphical.target相当于System V的init 5,multi-user.target相当于System V的init 3。
- 内置新的journald 日志管理系统。
- 引入localectl、timedatectl等新命令,系统配置更方便。
而且还配了一张神图:
上图最顶层“系统工具”中最常用的就是systemctl命令了(其实部分命令有些发行版系统默认都没有安装),总之呢,你可以把它理解为前面讲到的service和chkconfig命令的结合体。systemctl命令的使用还是比较复杂的,而且systemd体系也比较复杂,我怕我理解的还不够透彻讲不好,所以推荐两篇关于systemd的文章: