小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Computer & DL
  4. Linux
  5. 正文

《鸟哥的Linux私房菜》(基础篇)笔记整理(第17章)Part.1

2019年1月12日 1377点热度 0人点赞 0条评论

一、什么是daemon与服务

系统为了某些功能必须要提供一些服务(无论是系统本身还是网络方面),这个服务就是service。但是service的提供需要通过程序运行,所以这个程序称为daemon。

通常在Linux使用的时候,会在服务的名称后面加上一个d,这就是daemon程序的命名方式。例如例行性命令的建立的at,它的程序文件名就是atd。

1.systemd使用的unit分类

现在,包括Ubuntu在内的多个分支版本开始使用systemd这个启动服务管理机制。那么systemd有什么好处呢?

①平行处理所有服务,加速开机流程;

②已经要求就回应的on-demand启动方式;

③服务相依性的自我检查;

④依daemon功能分类;

⑤将多个daemons集合称为一个群组;

⑥向下兼容旧的init服务脚本

不过,有些地方systemd也无法完全取代init,包括:

①在runlevel的对应上,大概仅有runlevel1,3,5有对应到systemd的某些target类型而已,没有全部对应;

②全部的systemd都用systemctl这个管理程序管理,而systemctl支持的语法有限制,不像/etc/init.d/daemon就是纯脚本可以自定义参数,systemctl不可自定义参数;

③如果某个服务启动是管理员自己手动执行启动,而不是使用systemctl去启动的,那么systemd将无法侦测到该服务,而无法进一步管理;

④systemd启动过程中,无法与管理员通过standard input传入信息,因此自行撰写systemd的启动设定时,务必要取消互动机制。

(1)systemd的配置文件放置的目录

基本上,systemd将过去所谓的daemon执行脚本通通称为一个服务单位(unit),而每种服务单位依据功能来区分时,就分类为不同的类型(type)。基本的类型有包括系统服务、数据监听与交换的插槽档服务(socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境(target)等等。配置文件都存放在下面的目录中:

①/usr/lib/systemd/system/:每個服務最主要的啟動腳本設定,有點類似以前的 /etc/init.d 底下的檔案;

②/run/systemd/system/:系統執行過程中所產生的服務腳本,這些腳本的優先序要比 /usr/lib/systemd/system/ 高;

③/etc/systemd/system/:管理員依據主機系統的需求所建立的執行腳本,執行優先序又比 /run/systemd/system/ 高。

也就是说,到底系统开机会不会执行某些服务其实是看/etc/systemd/system/底下的设定,所以该目录底下就是一大堆连结档。而实际执行的systemd启动脚本配置文件,其实都是放置在/usr/lib/systemd/system/底下的喔!因此如果你想要修改某个服务启动的设定,应该要去/usr/lib/systemd/system/底下修改才对!/etc/systemd/system/仅是连结到正确的执行脚本配置文件而已。所以想要看执行脚本设定,应该就得要到/usr/lib/systemd/system/底下去查阅才对。

二、通过systemctl管理服务

1.通过systemctl管理单一服务(service unit)的启动/开机启动与观察状态

一般来说,服务的启动有两个阶段,第一个是开机的时候设置要不要启动这个服务,第二个是现在要不要启动这个服务。

systemctl常用的一些方法如下:

[root@study ~]# systemctl [command] [unit]

command主要有:

start:立刻启动后面接的unit;

stop:立刻关闭后面接的unit;

restart:立刻重启后面接的unit;

reload:不关闭后面接的unit的情况下,重载配置文件,让配置生效;

enable:设定下次开机时,后面接的unit会被启动;

disable:设定下次开机时,后面接的unit不会被启动;

status:目前后面接的这个unit的状态,会列出有没有正在执行、开机预设执行否、登录等信息等;

is-active:目前有没有正在运行;

is-enabled:开机时有没有预设要启用这个unit。

不应该使用kill的方式来关掉一个正常的服务,不然的话systemctl会无法继续监控该服务的。

服务的状态,主要有几种:

①active(running):正有一个或多个程序正在系统中执行的意思;

②active(exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行;

③active(waiting):正在执行当中,不过还再等待其他的事件才能继续处理;

④inactive:这个服务目前没有运行的意思。

daemon预置状态主要有以下几种:

①enabled:开机时执行;

②disabled:开机时不会执行;

③static:daemon不可以自己启动,不过可能会被其它的enabled的服务来调用;

④mask:daemon无论如何都无法启动,因为已经强制注销,不过可以通过systemctl unmask改变为原来的状态。

2.通过systemctl观察系统上所有的服务

如果想了解系统中有多少服务存在,那就需要通过list-units以及list-unit-files来观察了。具体用法如下:

[root@study ~]# systemctl [command] [--type=TYPE] [--all]

command:

list-units:依据unit列出目前有启动的unit。若加上--all才会列出没启动的。

list-unit-files:依据/usr/lib/systemd/system/内的文件,将所有文件列表说明。

--type=TYPE:就是之前提到的unittype,主要有service,socket,target等

当我们输入systemctl的时候,其实默认就是输出list-units的结果。输出的内容有多列,分别是以下的意义:

①UNIT:项目的名称,包括各个unit的类别;

②LOAD:开机时候是否会被载入,默认systemctl显示的是会被载入的项目;

③ACTIVE:目前的状态,须与后续的SUB搭配,就是我们用systemctl status观察时,active的项目;

④DESCRIPTION:详细描述。

当我们输入systemctl list-unit-files时,输出的各个列含义如下:

①UNIT FILE:顾名思义,就是unit file的名字。

②STATE:开机是否会载入的状态,分为enabled/disabled/mask/static等。

  1. 通过systemctl管理不同的操作环境(target-unit)

在我的Ubuntu中,有29个target unit,而跟操作系统界面相关性比较高的target有以下几个:

①graphical target(我的Ubuntu默认):文字+图形界面,这里面已经包括了下面的multi-user.target。

②multi-user.target:纯文本模式;

③rescue.target:在无法使用root登入的情况下,systemd在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得root的权限来维护你的系统。但是这是额外系统,因此可能需要动到chroot的方式来取得你原有的系统。

④emergency.target:紧急处理系统的错误,还是需要使用root登入的情况,在无法使用rescue.target时,可以尝试使用这种模式!

⑤shutdown.target:就是关机的流程。

⑥getty.target:可以设定你需要几个tty之类的,如果想要降低tty的项目,可以修改这个东西的配置文件。

总的来说,正常的模式是multi-user.target和graphical.target两个,而恢复模式则是rescue.target和更严重的emergency.target。如果要修改可以提供登录的tty数量,那就需要修改getty.target。

如何得知当前我们使用target或者如何设置target呢?用法如下

[root@study ~]# systemctl [command] [unit.target]

选项与参数:

command:

get-default:取得目前的target

set-default:设定后面接的target成为默认的操作模式

isolate:切换到后面接的模式。

注意:改变graphical.target和multi-user.target是通过isolate来处理!

system提供了数个简单的指令来给我们切换操作模式使用:

命令 解释
systemctl poweroff 关机
systemctl reboot 重新开机
systemctl suspend 进入暂停模式
systemctl hibernate 进入休眠模式
systemctl rescue 强制进入恢复模式
systemctl emergency 强制进入紧急恢复模式

suspend是将系统的状态数据保存到内存中,然后关闭大部分系统硬件,但是并没有实际关机。

hiberna是将系统状态保存到硬盘文件中,保存完毕后,系统关机。当开机的时候,系统开始正常运行,然后把保存在硬盘中的系统状态恢复出来。因为是从硬盘读出,所以速度与你的硬盘性能有关系。

4.通过systemctl分析各服务之间的相依性

[root@study ~]# systemctl list-dependencies [unit] [--reverse]

选项与参数:

--reverse:反向追踪谁使用这个unit。

 

5.与systemd的daemon运行过程有关的目录介绍

(1)/usr/lib/systemd/system/:使用CentOS官方提供的软件安装后,默认的启动脚本配置文件都放在这里,这里的数据尽量不要修改。要修改时,请到/etc/systemd/system底下修改较佳。

(2)/run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比/usr/lib/systemd/system/高!

(3)/etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx之类的功能,执行优先序又比/run/systemd/system/高。

(4)/etc/sysconfig/*:几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,mandb所要更新的manpage索引中,需要加入的参数就写入到此目录下的man-db当中喔!而网络的设置则写在/etc/sysconfig/network-scripts/这个目录内。所以,这个目录内的文件也是挺重要的。

(5)/var/lib/:一些会产生数据的服务都会将他的数据写入到/var/lib/目录中。举例来说,数据库管理系统Mariadb的数据库默认就是写入/var/lib/mysql/这个目录下。

(6)/run/:放置了好多daemon的缓存文件,包括lockfile以及PIDfile等等。

系统中设置让服务于端口号对应在一起的文件是/etc/services。

6.关闭网络服务

如何追踪网络服务的端口呢?可以使用“netstat -tlunp”这个命令,就可以查看到相关信息。例如我的电脑的信息如下:

root@xiaoao-virtual-machine:/home/xiaoao# netstat -tlunp

激活Internet连接 (仅服务器)

Proto Recv-Q Send-Q Local Address      Foreign Address    State     PID/Program name

tcp      0    0 127.0.0.53:53       0.0.0.0:*        LISTEN     528/systemd-resolve

tcp      0    0 0.0.0.0:22          0.0.0.0:*        LISTEN      1573/sshd

tcp    0   0 127.0.0.1:631          0.0.0.0:*        LISTEN      2504/cupsd

tcp6       0      0 :::22      :::*                 LISTEN      1573/sshd

tcp6       0      0 ::1:631      :::*               LISTEN      2504/cupsd

udp  38400   0 127.0.0.53:53      0.0.0.0:*                   528/systemd-resolve

udp  0   0 0.0.0.0:68              0.0.0.0:*                      763/dhclient

udp       0   0 0.0.0.0:59494      0.0.0.0:*                    631/avahi-daemon: r

udp    23936      0 0.0.0.0:5353    0.0.0.0:*                  631/avahi-daemon: r

udp    39104     0 0.0.0.0:45634   0.0.0.0:*              1560/miredo

udp        0      0 0.0.0.0:631     0.0.0.0:*                2506/cups-browsed

udp6   50496      0 :::5353      :::*                  631/avahi-daemon: r

udp6       0      0 :::52641      :::*                   631/avahi-daemon: r

我们用systemctl来观察下,到底有没有avahi-daemon为开头的服务呢?输入命令“systemctl list-units --all | grep avahi-daemon”。

如果我们想停用命令,可以这样:

systemctl stop 名称

这样就完成了停用。如下所示:

[root@study ~]# systemctl stop avahi-daemon.service

[root@study ~]# systemctl stop avahi-daemon.socket

[root@study ~]# systemctl disable avahi-daemon.service avahi-daemon.socket

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: linux 鸟哥的linux私房菜
最后更新:2019年1月12日

davidcheung

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

搜索
欢迎关注我的个人公众号
最新 热点 随机
最新 热点 随机
DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
奥地利匈牙利九日游旅程论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
莱芜赛区第四比赛日:天津VS河北,福建VS江苏 Python语言程序设计(第7周)知识点整理 玩转你的Gravatar全球通用头像 Leetcode题目解析(191108):215及221 WIN10+anaconda+CUDA9.0+CUDNN7.0安装配置Tensorflow(GPU)教程 Welcome to Jinan!华夏大地聚焦济南,全运会即将开幕!
标签聚合
Java Python 高中 leetcode 算法 生活 python学习 鸟哥的linux私房菜 学习 linux
最近评论
davidcheung 发布于 5 个月前(02月09日) The problem has been fixed. May I ask if you can s...
tk88 发布于 5 个月前(02月07日) Hmm is anyone else having problems with the pictur...
cuicui 发布于 9 个月前(10月20日) :wink:
niming 发布于 10 个月前(09月19日) 同级校友,能刷到太巧了
davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
aobai 发布于 3 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
匿名 发布于 5 年前(12月30日) 烫
小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19003234号-1

鲁公网安备37120202000100号