Centos7 以上使用Systemd进行系统初始化,Systemd是Linux系统中最新的初始化工具,它可以有效的提高系统的启动速度。本文将介绍Systemd的命令和参数说明,并实现一个简单的自启动服务。

Centos7 以上使用Systemd进行系统初始化,Systemd是Linux系统中最新的初始化工具,它可以有效的提高系统的启动速度。

Systemd 默认从目录/etc/systemd/system/读取配置文件。然而,里面存放的大部分文件都是符号链接,它们指向目录/usr/lib/systemd/system/,真正的配置文件(以 .service 结尾的文件)存放在那个目录。

我们可以将自定义程序注册为systemd service进程管理交给系统管理,可以方便启动停止,也可以实现服务异常退出重启,开机自启动,减少自定义程序服务管理的时间消耗。
service文件参数详解

service文件主要包含三个部分,分别是:[Unit]、[Service]、[Install]

如以下的nginx.service配置文件

配置文件内容 [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target

参数说明如下
参数名称 参数说明
[Unit]
Description 一段描述这个 Unit 文件的文字,通常只是简短的一句话。
Documentation 指定服务的文档,可以是一个或多个文档的URL路径。
Requires 依赖的其他 Unit 列表,列在其中的 Unit 模块会在这个服务启动的同时被启动,并且如果其中有任意一个服务启动失败,这个服务也会被终止
After 与 Requires 相似,但会在后面列出的所有模块全部启动完成以后,才会启动当前的服务。
Before 与 After 相反,在启动指定的任一个模块之前,都会首先确保当前服务已经运行。
Wants 与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模块启动是否成功。
Conflicts 与这个模块有冲突的模块,如果列出模块中有已经在运行的,这个服务就不能启动,反之亦然。
OnFailure 当这个模块启动失败时,就自动启动列出的每个模块。
[Service]
Type 服务的类型,常用的有 simple(默认类型) 和 forking。默认的 simple 类型可以适应于绝大多数的场景,因此一般可以忽略这个参数的配置。而如果服务程序启动后会通过 fork 系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将 Type 的值设置为 forking,否则 systemd 将不会跟踪子进程的行为,而认为服务已经退出。
Environment 为服务添加环境变量
EnvironmentFile 指定加载一个包含服务所需的环境变量列表的文件,文件中的每一行都是一个环境变量的定义。
ExecStart 这个参数是几乎每个 .service 文件都会有的,指定服务启动的主要命令,在每个配置文件中只能使用一次。(需要使用绝对路径)
ExecStartPre 指定在启动执行 ExecStart 的命令前的准备工作,可以有多个,所有命令会按照文件中书写的顺序依次被执行。
ExecStartPost 指定在启动执行 ExecStart 的命令后的收尾工作,也可以有多个。
ExecStop 停止服务所需要执行的主要命令。(需要使用绝对路径)
ExecStopPost 指定在 ExecStop 命令执行后的收尾工作,也可以有多个。
ExecReload 重新加载服务所需执行的主要命令。(需要使用绝对路径)
Restart 这个值用于指定在什么情况下需要重启服务进程。常用的值有 no,on-success,on-failure,on-abnormal,on-abort 和 always。默认值为 no,即不会自动重启服务。这些不同的值分别表示了在哪些情况下,服务会被重新启动
RestartSec 如果服务需要被重启,这个参数的值为服务被重启前的等待秒数。
Nice 服务的进程优先级,值越小优先级越高,默认为0。-20为最高优先级,19为最低优先级。
WorkingDirectory 指定服务的工作目录。
RootDirectory 指定服务进程的根目录( / 目录),如果配置了这个参数后,服务将无法访问指定目录以外的任何文件。
User 指定运行服务的用户,会影响服务对本地文件系统的访问权限。
Group 指定运行服务的用户组,会影响服务对本地文件系统的访问权限。
PrivateTmp 是否给服务分配独立的临时空间(true/false)
[Install]
WantedBy 和前面的 Wants 作用相似,只是后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。“WantedBy=multi-user.target” 表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。当然还需要 systemctl enable 激活这个服务以后自动运行才会生效。
RequiredBy 和前面的 Requires 作用相似,同样后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。
Also 当这个服务被 enable/disable 时,将自动 enable/disable 后面列出的每个模块。

注意:[Service]的启动、重启、停止命令全部要求使用绝对路径

想了解更详细的参数说明可以在systemd.service 中文手册中查看
systemctl常用命令

以nginx.service为例

启动nginx服务 systemctl start nginx.service # 停止nginx服务 systemctl stop nginx.service # 重启nginx服务 systemctl restart nginx.service # 查看nginx服务状态 systemctl status nginx.service # 在开机时启用一个服务 systemctl enable nginx.service # 在开机时禁用一个服务 systemctl disable nginx.service # 查看服务是否开机启动 systemctl is-enabled nginx.service # 重新读取nginx配置(不用停止nginx服务就能使修改的配置生效) systemctl reload nginx.service # 重新加载systemd(一般修改完配置文件执行该命令使配置生效) systemctl daemon-reload # 查看已启动的服务列表 systemctl list-unit-files | grep enabled # 查看启动失败的服务列表 systemctl --failed

其中,systemctl enable命令用于/etc/systemd/system/和/usr/lib/systemd/system/两个目录之间,建立符号链接关系。

systemctl enable nginx.service # 等同于 ln -s '/usr/lib/systemd/system/nginx.service' '/etc/systemd/system/multi-user.target.wants/nginx.service'

systemd 默认从目录/etc/systemd/system/读取配置文件,所以systemctl enable命令相当于激活开机启动。

同理,systemctl disable用于撤销两个目录之间的符号链接关系,也就撤销了开机启动。

在上面内容的基础下,我们尝试编写一个自己的systemd服务,本次的systemd服务主要是执行一段python脚本。

在/root/pyfile路径(这里可以改为你自己的路径)下创建run.py,内容如下

import time import string import random f = open('/root/pyfile/a.txt', 'w') for i in range(100): words = ''.join(random.sample(string.ascii_lowercase, 5)) row = '--- No.{}, {} ---n'.format(i, words) f.write(row) f.flush() time.sleep(2) f.close()

以上脚本的作用是在100次遍历中,每2s生成一个随机的单词,并将单词写入到a.txt中。

接下来我们来编写自定义的systemd服务,在/usr/lib/systemd/system路径下新建pyscript.service服务,内容如下

[Unit] Description=python script [Service] Type=simple WorkingDirectory=/root/pyfile ExecStart=python run.py [Install] WantedBy=multi-user.target

编写完成后,保存并执行以下命令

systemctl daemon-reload systemctl start pyscript.service

进入/root/pyfile目录下执行tail -f a.txt可以看出每2s打印一个随机单词,如下

--- No.0, jkqdr --- --- No.1, beqvu --- --- No.2, eaqrw --- --- No.3, kuljf --- --- No.4, qmzhl ---

接下来我们设置开机启动pyscript.service服务

systemctl start pyscript.service

执行后系统生成了一个符号链接,如下

Created symlink /etc/systemd/system/multi-user.target.wants/pyscript.service → /usr/lib/systemd/system/pyscript.service.

然后重启服务器,等待重启完毕后,执行以下命令查看python脚本是否执行

ps -ef | grep python

可以发现多了如下进程

root 738 1 0 18:00 ? 00:00:00 /usr/bin/python run.py

再次进入/root/pyfile目录,执行tail -f a.txt,可以发现文本正在打印。

自此,我们已经成功完成了自定义systemd服务的编写和启动。

前言

1、ondemand:系统默认的超频模式,按需调节,内核提供的功能,不是很强大,但有效实现了动态频率调节,平时以低速方式运行,当系统负载提高时候自动提高频率。以这种模式运行不会因为降频造成性能降低,同时也能节约电能和降低温度。一般官方内核,还有CM7的默认的方式都是ondemand。
流畅度: 一般,流畅

2、interactive:交互模式,直接上最高频率,然后看CPU负荷慢慢降低,比较耗电。
流畅度: 最高,极流畅
Interactive 是以 CPU 排程数量而调整频率,从而实现省电。
InteractiveX 是以 CPU 负载来调整 CPU 频率,不会过度把频率调低。所以比 Interactive 反应好些,但是省电的效果一般

3、conservative:保守模式,类似于ondemand,但调整相对较缓,想省电就用他吧。Google官方内核,kang内核默认模式。
流畅度: 高,流畅

4、smartass:聪明模式,是I和C模式的升级,该模式在比i模式不差的响应的前提下会做到了更加省电
流畅度: 最高,流畅

5、performance:性能模式!只有最高频率,从来不考虑消耗的电量,性能没得说,但是耗电量…
流畅度:还需要说么?还有比这种模式更流畅的吗?

6、powersave 省电模式,通常以最低频率运行,打不死我也不用。
流畅度: 极低

7、userspace:用户自定义模式,系统将变频策略的决策权交给了用户态应用程序,并提供了相应的接口供用户态应用程序调节CPU 运行频率使用。也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置
流畅度:根据设置而定

8、Hotplug:类似于ondemand, 但是cpu会在关屏下尝试关掉一个cpu,并且带有deep sleep,比较省电。
流畅度:一般,流畅

Linux下设置相关参数
设置performance模式
CentOS7下配置

首先,需要知道Linux有一个叫做cpupower的工具集,用来检查和调整处理器的能耗相关的一些features。其中的一个工具叫做“frequency-set”,可以用来调整cpu运行频率。

使用下面的命令来查看当下可用的drivers,即governors:

cpupower frequency-info --governors # cpupower -c all frequency-info --governors analyzing CPU 0: available cpufreq governors: performance powersave analyzing CPU 1: available cpufreq governors: performance powersave

光手动的用cpupower –c all frequency-set –g performance 来修改是不够的,我们需要让这个配置在开机的时候就生效。所以,需要创建一个由systemd管理的服务,让这个服务在开机的时候就自动运行。

运行下面的命令,直接修改/etc/systemd/system/cpupower.service这个文件,使得这个服务开机就运行一次(oneshot), 不始终保持运行。

$ cat << EOF | sudo tee /etc/systemd/system/cpupower.service [Unit] Description=CPU powersave [Service] Type=oneshot ExecStart=/usr/bin/cpupower -c all frequency-set -g powersave [Install] WantedBy=multi-user.target EOF

问题解决。
其它办法

方法一:在bios(cpu 选项,或者电源管理选项)直接配置为max performance(我的系统无法设置),重启即可;

方法二:

yum install cpupowerutils cpupower -c all frequency-set -g performance #(不用安装,自带cpupower 命令) #或者 cpupower frequency-set -g performance

方法三:

service cpuspeed stop

这里按需重启系统,最好试一下重启能不能生效,有的服务器会在重启之后失效,必须在bios里面设置
查看当前governor

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor #powersave或者performance cat /proc/cpuinfo | grep -i "cpu mhz" #显示每个CPU的当前运行频率 cpupower frequency-info