鸟哥linux私房菜

第16章 程序管理和 SELinux 初探

工作管理

在 linux 中与终端相关联的进程称为工作。 在一个终端中可以有多个后台工作, 但是只有一个前台工作。 并且这些工作的标准输出和标准错误输出,都是输出在屏幕上。

你可以在命令后面加上一个& 将一个工作放到后台运行, 也可以使用 ctrl+Z将一个正在前台运行的工作放到后台执行。 并且每个工作都会配分工作号。

下面是一些工作相关的命令:

1
2
3
jobs  -l # 显示所有的工作
fg %jobsnumber  #  将一个后台工作放到前台执行
kill [signal] %jobnumber #  杀死一个工作

如果你想要你退出终端后,工作继续执行, 你可以使用nohub 命令。

1
2
nohup  [命令] [参数]   & 
nohup   [命令] [参数]  > test.log 2>&1  &

第五部分: Linux 系统管理员

第17章 认识系统服务

在 linux 中常驻在内存汇中,提供一些功能的进程称为守护进程(daemon)。 linux 有两种方式来管理这些守护进程的程序, 一个称为 initsystemd. 不过前者目前已经废弃。

使用 init 管理服务

使用 init 管理守护进程有下面的特点:

服务的管理方式

init 所有的守护进程的启动脚本都放到 /etc/ini.d下面, 都是由shell写成的脚本程序, 你可以使用下面的命令管理守护进程:

  • 启动:/etc/init.d/daemon start
  • 关闭:/etc/init.d/daemon stop
  • 重新启动:/etc/init.d/daemon restart
  • 状态观察:/etc/init.d/daemon status

服务启动的分类

init 有两种方式来启动守护进程:stand alonesuper daemon 两种方式:

  • 独立启动模式 (stand alone):服务独立启动,该服务直接常驻于内存中,提 供本机或用户的服务行为,反应速度快。
  • 总管程序 (super daemon):由特殊的 xinetd 或 inetd 这两个总管程序提供socket 对应或 port 对应的管理。当没有用户要求某 socket 或 port 时, 所需要的服务是不会被启动的。若有用户要求时, xinetd 总管才会去唤醒相对应的服务程序。当该要求结束时,这个服务也会被结束掉~ 因为通过 xinetd 所总管,因此这个家伙就被称为 super daemon。好处是可以通过 super daemon 来进行服务的时程、连线需求等的控制,缺点是唤醒服务需要一点时间的延迟。

服务的依赖性问题

有些服务存在一些依赖问题, 机该服务依赖另外一个服务提供的功能。 那么在启动这个服务之前, 就必须启动另外一个服务。 这些关系都需要你自己进行手动处理。

执行等级分类

在linux 中内置了各种各样的服务, 你或许不需要启动所有的服务。 linux 系统提供了7个不同的运行级别, 分别是 0, 1,2,…,6, 比较重要的是 1)单人模式、3)纯文本模式、5)文字加图形界面。 不同的运行级别需要执行的服务是不同, 其各个等级的需要执行的脚本分别放在/etc/rc[0-7].d中, 这些目录中都是连接到 /etc/init.d 中的连接文件, 其名字为(SXXdaemon, S 表示启动该服务, XX 脚本的启动顺序, daemon 是服务名字。 根据XX就能够依次执行程序, 解决程序相互依赖问题。

添加任务到执行等级中

当你要添加服务到执行等级中, 也就是创建名为 SXXXdaemon 的连接文件中时, 可以使用下面的命令:

  • 默认启动 checkconfig daemon on
  • 默认不启动 checkconfig daemon off
  • 观察任务行为 checkconfig --list daemon

切换执行级别

当你要从纯命令行 (runlevel 3) 切换到图形界面 (runlevel 5), 不需要手动启 动、关闭该执行等级的相关服务,只要“ init 5 ”即可切换,init 这小子会主动去分析/etc/rc.d/rc[35].d/ 这两个目录内的脚本, 然后启动转换 runlevel 中需要的服务~就完成整体的 runlevel 切换。

使用 systemd 管理服务

服务启动脚本的存放目录

在 systemd 将过去daemon的执行脚本称为 unit, 这些unit 又根据功能被分为 type. 基本的类型又系统服务, scoket 服务, 以及提供类似不同的运行级别的 target 类型等。 其配置文件放在下面的目录下:

  • /lib/systemd/system 每个服务的启动脚本, 类似以前 /etc/init.d .
  • /run/systemd/system 系统在运行过程中产生的服务脚本, 优先级别比 /usr/lib/systemd/system
  • /etc/systemd/system 系统管理员根据主机系统的需求创建的执行脚本, 类似以前的 /etc/rc[d].d/SXX的功能, 其都是连接到 /lib/systemd/system 中文件的连接文件, 其优先级别比/run/sysntemd/system 高。

服务的分类

systemd 中服务被称为 unit, 而 unit 又被分为不同的type, 如何区别不同的type呢? 答案是通过执行的脚本的后缀:

扩展类型 主要的服务功能
.service 一般的服务类型, 主要是系统服务
.socket 内部程序通过 socket 交换数据的服务,通常是用于 IPC功能, 或者收集系统的监控信息之类
.target 执行环境类型, 一组服务的集合, 类似 /etc/rc_[0-9].d
.mount .automount 文件系统挂载相关的服务
.path 用来检查某些文件或者目录的服务类型
.timer 循环执行的服务类型

通过systemd管理服务

systemctl [command] [unit] 其中 Command 有下面的参数:

  • start: 立刻重启后面的服务
  • stop: 立刻关闭后面的服务
  • restart: 立刻关闭后面的服务, 然后启动后面的服务(stop 和start)
  • reload: 在不关闭后面的服务, 然后重新载入配置文件, 让配置文件生效
  • enable:设置后面的服务开启启动
  • disable: 禁止后面的服务开启启动
  • is-active: 当前服务是否在运行中
  • is-enable:后面的服务是否是开机启动

正在执行的进程有下面的状态:

  • active (running):正有一只或多只程序正在系统中执行
  • active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。
  • active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。
  • nactive:这个服务目前没有运行的意思

服务的默认状态有:

  • enabled:这个 daemon 将在开机时被执行
  • disabled:这个 daemon 在开机时不会被执行
  • static:这个 daemon 不可以自己启动 (enable 不可),不过可能会被其他的 enabled 的服务来唤醒 (相依属性的服务)
  • mask:这个 daemon 无论如何都无法被启动!因为已经被强制注销 (非删除)。可 通过 systemctl unmask 方式改回原本状态(mask 实际上就是让脚本连接到 /dev/null 文件。

通过systemctl 管理不同的运行环境

target 类似 init 中的运行级别, 下面是一些对照

systemd targets SystemV runlevel target aliases Description
default.target This target is always aliased with a symbolic link to either multi-user.target or graphical.target. systemd always uses the default.target to start the system. The default.target should never be aliased to halt.target, poweroff.target, or reboot.target.
graphical.target 5 runlevel5.target Multi-user.target with a GUI
4 ssrunlevel4.target Unused. Runlevel 4 was identical to runlevel 3 in the SystemV world. This target could be created and customized to start local services without changing the default multi-user.target.
multi-user.target 3 runlevel3.target All services running, but command-line interface (CLI) only
2 runlevel2.target Multi-user, without NFS, but all other non-GUI services running
rescue.target 1 runlevel1.target A basic system, including mounting the filesystems with only the most basic services running and a rescue shell on the main console
emergency.target S Single-user mode—no services are running; filesystems are not mounted. This is the most basic level of operation with only an emergency shell running on the main console for the user to interact with the system.
halt.target Halts the system without powering it down
reboot.target 6 runlevel6.target Reboot
poweroff.target 0 ss runlevel0.target Halts the system and turns the power off

下面是一些执行环境相关的操作:

  • systemctl get-default 获取当前默认执行环境
  • systemctl set-default unit.target 设置默认的执行环境
  • systemctl isolate unit.target 切换执行环境
  • systemctl list-dependencies [–reverse]获取服务之间的依赖关系。

systemctl isolate multi-user.target 切换到纯文本的执行环境 systemctl isolate graphical.target 切换到图形化的执行环境