Ubuntu服务相关命令(service, update-rc.d, systemctl)
本博客参考了网上的各种资料和man,以及<< How linux works >>一书部分内容
init基本说明
- 内核启动第一个用户空间进程是由init开始的,你可以在/sbin目录下找到init,它主要复制启动和终止系统中的基础服务进程.
linux系统中主要的init版本有如下
init类型 说明 识别 Systemd 新出现的init,很多linux发行版都已经或者计划转向Systemd 如果你的系统目录文件中/usr/lib/systemd和/etc/systemd,说明你有systemd,例如我的ubuntu 17.10就有 Upstart ubuntu曾经使用的init,但是现在已经转向了systemd 系统目录有/etc/init,而且其中有许多conf文件,说明你的系统有upstart(除非你的系统是debian7,那说明你使用的是System V init),同时,我发现我的ubuntu 17.10也有这个目录,我猜测可能是为了兼容(此处存疑问,现在的ubuntu的init确实是systemd) System V init 传统的init,大多数的linux发行版都会兼容 系统有/etc/inittab文件,说明你很可能是System V init
service 命令
- 说明:执行System V init 的脚本,其实service命令执行的脚本就是在/etc/init.d/下的.
命令简单用处
sercice SCRIPT COMMAND
实际上,SCRIPT是在/etc/init.d/
下的,而COMMAND可以是start,stop,status,restart,reload,它们的作用是显而易见的(例如开启ssh服务可以sudo service ssh start
)。service --status-all
会显示出所有系统服务列表,其中”+”代表服务正在运行,而”-“代表服务处于关闭状态,”?”代表根本没有状态这一说。(其实查看运行服务还可以用ps aux | grep service_name
查看进程情况;如果是网络服务,还可以查看端口的监听情况,执行 `netstat -tuln | grep service_name/port_number,例如可以执行 netstat -tuln | grep ftp查看端口状态,默认端口为21)
update-rc.d 命令
- 说明:安装或者移除 System-V init的脚本连接(可以理解为指向脚本的快捷方式,即
/etc/rc*runlevel*.d/NNname => /etc/init.d/name)
。你可以通过runlevel
命令查看当前的运行级别,runlevel的概念网上一大堆就不提及了。简单来说,假如我的机器开机默认会进入runlevel为5的空间(ubuntu图形界面),那么就会在开机后执行/etc/rc5.d/*下所有的脚本(这样描述有些误差,其实此目录下都是软链接,指向/etc/init.d/下相对应的脚本)。另外,你还会发现这些链接的命名规则很有意思,一般来说,K开头的链接是关闭这个服务,而S开头的才是启动这个服务。此时应该有疑问,为什么链接都是指向同一个脚本,但是功能确是截然相反?网上有人说是这两个字母给脚本传递了不同的参数,但其实这个过程怎么实现我还不是很清楚(可以cat一下/etc/init.d/rsyslog的内容,这个shell脚本思路还是很清晰的,先是定义了各种函数,然后通过参数$1运用case语句来调用不同的函数,此时你会发现service serv_name COMMAND
其实和/etc/init.d/serv_name COMMAND
是一样的) - 简单来说,你可以通过此命令控制开机自启动服务。
- 开机启动服务(建立软链接):
update-rc.d foobar defaults
- 移除所有软链接:
update-rc.d foobar remove
- 关闭开机启动服务:
update-rc.d foobar disable
- 重新开启开机启动服务:
update-rc.d foobar enable
- 开机启动服务(建立软链接):
systemd命令
- 许多linux的distributions都已经转投systemd了,而ubuntu自从15.04版本以后都使用了systemd.
只介绍常见常用的命令:
- 打开服务:
sudo systemctl start foobar
- 关闭服务:
sudo systemctl stop foobar
- 重启服务:
sudo systemctl restart foobar
- 不中断正常功能下重新加载服务:
sudo systemctl reload foobar
- 设置服务的开机自启动:
sudo systemctl enable foobar
- 关闭服务的开机自启动:
sudo systemctl disable foobar
- 查看活跃的单元:
systemctl list-units
- 查看某个服务的状态:
systemctl status foobar
- 打开服务: