判断linux系统中的服务管理命令是service还是systemctl

作为网站维护人员,经常要管理客户linux系统中运行的一些服务,例如mysql,nginx等。然而客户的linux系统版本不同,甚至是不同的distribution,因此我经常会遇到一个问题,到底这个linux的服务管理命令是service还是systemctl呢?

一开始我会用以下办法来解决这个问题,那就是查看当前linux系统的distribution及版本号。因为我在网上经常看到CentOS 6重启mysql的命令是 service mysql  restart,CentOS 7的是 systemctl restart mysql。查看linux系统distribution及版本号的命令是 lsb_release -a 。如下图所示,当前linux系统为CentOS 7,所以可以用systemctl来管理系统中运行的服务。

2016-07-19 16:03:10屏幕截图.png

大部分情况下这个办法是可行的,但有时候系统中无法使用 lsb_release -a 命令,且linux的distribution也不只有CentOS,还有RedHat、Debian、Ubuntu等。要记住这些distribution版本号对应的服务管理命令也不是不可能,我相信大部分人不会这样做的。

还有一种办法就是尝试,两个命令都试一遍,哪个正确就用哪个。这种办法避免不了会看到一些报错信息,非常不符合系统维护人员精准控制的感觉。

直到我了解到,linux系统中的服务管理程序跟init进程有关系,这个问题才算得到彻底的解决。

计算机从按开机键到系统启动的流程,在流程启动的最后一步就是启动系统的第一个用户态进程init进程,其进程ID永为1。目前比较流行的init进程分为三种:sysvinit、upstart、systemd。使用命令 pstree 就能看到当前的linux系统的init进程。通常我们见到的init进程是sysvinit和systemd,对应系统可以使用的命令是service和systemctl。

例如:

2016-07-19 16:50:22屏幕截图.png

可用的服务管理命令是service。

2016-07-19 16:51:14屏幕截图.png

可用的服务管理命令是systemctl。