linux 修改时区_【003】一文全面掌握Linux初始化进程(超详细)
总第79篇
本文将详细梳理Linux
系统的初始化进程systemd
。通过对此进程的理解,你将对系统的初始化有一个深入的理解,从而更好地理解其它的操作。
Linux
系统的开机过程是这样的:从BIOS
开始,进入Boot Loader
,再加载内核系统,进行内核初始化,最后启动初始化进程。以前Linux
的启动一直是采用init
进程的,启动服务的方式如下:
$sudo /etc/init.d/apache2 start
或者
$service apache2 start
这种启动方式有两个缺点:一是启动时间长,init
进程是串行启动,只有前一个进程启动完成,才会启动下一个进程;二是启动脚本复杂,init
进程只执行启动脚本,不管其它事情,脚本需要处理各种情况,从而使得脚本变得很长。
1.systemd
概述
根据Linux
惯例,字母d
是守护进程(daemon
)的缩写, systemd
的含义是它要守护整个系统。 systemd
是为了解决initd
的缺点问题而诞生的, 它为系统的启动和管理提供了一套完整的解决方案。
使用systemd
就不再需要initd
了,它成了系统的第一个进程(PID
= 1),其它进程都是它的子进程。systemd
初始化进程服务采用并发启动机制,开机速度得到了很大的提升。可以用命令$ systemctl --version
命令 查看systemd
的版本。
systemd
的优点是功能强大,使用方便,其缺点是体系庞大,非常复杂,与操作系统的其它部分强耦合,下图是systemd
的体系架构图。
2. systemd
对系统的管理
systemd
并不是一个命令,而是一组命令,涉及到对系统各方面的管理。
systemctl
是systemd
的主命令,用于管理系统。其常用的操作如下:
# 重启系统
$ sudo systemctl reboot# 关闭系统,切断电源
$ sudo systemctl poweroff# CPU停止工作
$ sudo systemctl halt# 暂停系统
$ sudo systemctl suspend# 让系统进入冬眠状态
$ sudo systemctl hibernate# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue
systemd-analyze
命令用于查看启动时的耗时。其常用的操作如下:
# 查看启动耗时
$ systemd-analyze # 查看每个服务的启动耗时
$ systemd-analyze blame# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service
hostnamectl
命令用于查看当前主机的信息。其常用的操作如下:
# 显示当前主机的信息
$ hostnamectl# 设置主机名。
$ sudo hostnamectl set-hostname rhel8
localectl
命令用于查看本地化设置。其常用的操作如下:
# 查看本地化设置
$ localectl# 设置本地化参数。
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB
timedatectl
命令用于查看当前时区设置。其常用的操作如下:
# 查看当前时区设置
$ timedatectl# 显示所有可用的时区
$ timedatectl list-timezones # 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
loginctl
命令用于查看当前登录用户的相关信息。其常用的操作如下:
# 列出当前session
$ loginctl list-sessions# 列出当前登录用户
$ loginctl list-users# 列出显示指定用户的信息
$ loginctl show-user wujitao
3. 资源单位Unit
systemd
可以管理所有的系统资源,不同的资源统称为Unit
。 Linux
系统中Unit
可以分为12种,列表如下:
uUnit | 说明 |
---|---|
Service Unit | 系统服务 |
Target Unit | 多个Unit构成一个组 |
Device Unit | 硬件设备 |
Mount Unit | 文件系统的挂载点 |
Automount Unit | 自动挂载点 |
Path Unit | 文件或路径 |
Scope Unit | 不是由systemd启动的外部进程 |
Slice Unit | 进程组 |
Snapshot Unit | systemd快照,可以切回某个快照 |
Socket Unit | 进程间通信的socket |
Swap Unit | swap文件 |
Timer Unit | 定时器 |
用systemctl list-units
命令可以查看当前系统的所有Unit
。其常用的操作如下:
# 列出正在运行的 Unit
$ systemctl list-units# 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all# 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive# 列出所有加载失败的 Unit
$ systemctl list-units --failed# 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service
可以用systemctl status
命令查看系统状态和单个Unit
的状态。其常用操作如下:
# 显示系统状态
$ systemctl status# 显示单个 Unit 的状态
$ sysystemctl status bluetooth.service# 显示远程主机的某个 Unit 的状态
$ systemctl -H root@rhel8.redhat.com status httpd.service# 显示某个 Unit 是否正在运行
$ systemctl is-active application.service# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service
对一用户来说,最常用的操作就是启动或停止Unit
(主要是service
)。下面列出一常用的操作:
# 立即启动一个服务
$ sudo systemctl start apache.service# 立即停止一个服务
$ sudo systemctl stop apache.service# 重启一个服务
$ sudo systemctl restart apache.service# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500
若Unit
之间存在依赖关系,比如A
依赖于B
,这意味着在systemd
启动A
时,会同时去启动B
。可以用$ systemctl list-dependencies
命令列出一个Unit
的所有依赖,如下所示:
#列出蓝牙服务的所有依赖资源
$ systemctl list-dependencies --all bluetooth.service
#-all参数用来展开target,若不想展开,则可去掉
4. Unit
的配置文件
每个Unit
都有一个配置文件,告诉systemd
如何启动这个Unit
。 systemd
默认从目录/etc/systemd/system
中读取配置文件,但这个目录中大部分是软链接文件,真正的配置文件存放在目录/usr/lib/systemd/system/
中。
配置文件的后缀名,表明就是该Unit
的种类,若无后缀名,则用默认后缀名.service
。
可以用systemctl enable
或systemctl disable
命令在两个目录间建立或取消符号链接,如下示例:
#建立符号链接
$ sudo systemctl enable atd.service
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/atd.service' '/etc/systemd/system/atd.service'#取消符号链接
$ sudo systemctl disable atd.service
可以用systemctl list-unit-files
命令列出所有的配置文件,如下图所示:
可以看到每个配置文件的状态,其状态含义如下:
- enabled:已建立启动链接;
- disabled:未建立启动链接;
- static:该配置文件没有
install
部分,只能作为其它配置文件的依赖;
注意,仅从配置文件状态还无法看出此Unit
是否正在运行,必须执行systemctl status
命令才可以。
对于目录下的配置文件,一旦修改,就必须让systemd
重新加载配置文件,并重新启动,否则修改不会生效,其操作步骤如下:
#如修改了httpd的配置文件,要先重载,再重启
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
配置文件就是普通的文本文件,可用systemctl cat
命令查看配置文件的内容。 配置文件的完整字段清单可以参考官方文档 。
5. Target
systemd
用target
代替了传统init
启动模式里面的运行级别的概念。每个target
中包含多个Unit
,这样启动某个target
就会启动里面所有的Unit
,从这个意义上说,target
相当于一个“状态点”,启动某个target
就启动至某种状态。
注意,传统的运行级别是互斥的,不可能多个RunLevel
同时启动,但是多个target
可以同时启动。其常用的几个操作如下:
# 查看当前系统的所有 Target
$ systemctl list-unit-files --type=target# 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target# 查看启动时的默认 Target
$ systemctl get-default# 设置启动时的默认 Target
$ sudo systemctl set-default multi-user.target# 切换 Target 时,默认不关闭前一个 Target 启动的进程,
# systemctl isolate 命令改变这种行为,
# 关闭前一个 Target 里面所有不属于后一个 Target 的进程
$ sudo systemctl isolate multi-user.target
target
与传统RunLevel
的对应关系如下图所示:
若想要将系统默认的运行目标修改为“多用户无图形”模式,可直接用符号即可,命令如下:
$ sudo ln -sf /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
6. 日志管理
systemd
统一管理所有Unit
的启动日志,带来的好处是,可以只用journalctl
一个命令查看所有日志(包括内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf
。
journalctl
的功能非常强大,其常用的操作如下示例:
# 查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl# 查看内核日志(不显示应用日志)
$ sudo journalctl -k# 查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0# 查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1# 查看指定时间的日志
$ sudo journalctl --since="2020-10-01 18:18:18"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2019-01-10" --until "2020-01-11 00:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"# 显示尾部的最新10行日志
$ sudo journalctl -n# 显示尾部指定行数的日志
$ sudo journalctl -n 20# 实时滚动显示最新日志
$ sudo journalctl -f# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd# 查看指定进程的日志
$ sudo journalctl _PID=1# 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash# 查看指定用户的日志
$ sudo journalctl _UID=33 --since today# 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f# 合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today# 查看指定优先级(及其以上级别)的日志,共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b# 日志默认分页输出,--no-pager 改为正常的标准输出
$ sudo journalctl --no-pager# 以 JSON 格式(单行)输出
$ sudo journalctl -b -u nginx.service -o json# 以 JSON 格式(多行)输出,可读性更好
$ sudo journalctl -b -u nginx.serviceqq-o json-pretty# 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage# 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years
7.systemd
应用操作实战
若想设置某个服务在开机时启动,可以输入如下命令:
#设置开机启动httpd.service
$ sudo systemctl enable httpd
设置开机启动以后,服务并不会立即启动,必须等下一次开机,如果现在就想运行此服务,可用:
$ sudo systemctl start httpd
执行此命令后,服务也有可能启动失败,可用如下命令查看一下服务的状态:
$ sudo systemctl status httpd
若你想终止正在运行的服务,可以执行如下命令:
$ sudo systemctl stop httpd.service
当然有时可能此命令没有响应,服务也没有停下来,这时候不得不杀进程了,可用如下命令:
$ sudo systemctl kill httpd.service
也可以重启服务:
$sudo systemctl restart httpd.service
本文到此结束!下篇继续!
如果对你有帮助,请随手 点赞 或 赞赏!关注本专栏,更多干货与你分享。
=======================================================
欢迎【关注、私信 @武三郎】。我们一起交流一起进步。
linux 修改时区_【003】一文全面掌握Linux初始化进程(超详细)相关推荐
- linux 修改时区_如何在 Ubuntu 20.04 上设置或者修改时区
本文最先发布在: 如何在 Ubuntu 20.04 上设置或者修改时区www.itcoder.tech 使用正确的时区,对于系统相关的任务和进程来说,是最基本的.例如,cron 守护进程,使用系统时 ...
- linux 修改时区_教你在Centos8中更改时区
对于许多与系统相关的任务和进程,使用正确的时区是必不可少的.例如,cron守护进程使用系统的时区执行cron作业,日志文件中的时间戳基于同一系统的时区. 环 境 CentOS 8 检查现在的时区 t ...
- linux java时区_教大家几种在Linux系统中查看时区的方法
前言 在这篇短文中,我们将向你简单介绍几种 Linux 下查看系统时区的简单方法.在 Linux 机器中,尤其是生产服务器上的时间管理技能,是在系统管理中一个极其重要的方面. 好,我们一起来看几种查看 ...
- linux修改时间_技术干货||基于Centos8的Linux简单入门学习笔记
很基础 以后不想记笔记了 最后分享一次
- Linux修改时区和时间
Linux修改时区和时间 修改时区: 1> 找到相应的时区文件 /usr/share/zoneinfo/Asia/Shanghai 用这个文件替换当前的/etc/localtime文件. 或 ...
- debian linux 修改时区
1. UTC时区切换到CST 时区 # echo "export TZ='Asia/Shanghai'" >> /etc/profile # cat /etc/prof ...
- [转帖]Linux修改时区
公司一台国产服务器的时间总是错的 我用 date -R 出来的结果 是 +7.0 修改办法就是 这个文档来里面的 https://www.cnblogs.com/royfans/p/8056270.h ...
- Linux修改时区(tzselect) 【例子:修改时区 为 中国 东8区 的时间】
文章连接:https://blog.csdn.net/sxzlc/article/details/115792270 ======= 扩展: 使用Linux的tzselect功能,查看各个洲都有哪些国 ...
- Linux 修改时区和时间
时区文件 CentOS 和 Ubuntu 的时区文件是 /etc/localtime , 但是在 CentOS7 以后 localtime 以及变成了一个链接文件 : # ll /etc/localt ...
最新文章
- HTTP协议详解(真的很经典)
- jmeter mysql plugin_安装一个jmeter的插件--实现监控事务响应时间、tps等功能
- halcon 形状匹配
- python编程界面怎么打开-为Python程序添加图形化界面的教程
- iOS 开发 需要的版本管理工具,UI图,bug管理工具等
- jsp中未登录用户也可以浏览页面的功能实现代码
- KubeSphere 3.1.0 GA:混合多云走向边缘,让应用无处不在
- Swoole 源码分析——Server模块之初始化
- 线段树动态开点区间加区间求和
- 单元测试原来是这样的呼
- python copy
- Linux arm 下载程序,arm-linux—gcc如何下载安装
- 计算机音乐深海少女,深海少女 MIDI File Download :: MidiShow
- 网络电话坐享iOS10红利 iphone7免费通话
- java中listview_需要高效的数据映射在Android /Java中进行ListVIEW钻孔的例子
- OSPF多区域配置实例
- 通信原理中的erf/erfc函数
- 使用rimraf一秒删除node_modules文件夹【亲测有用】
- 目前最精准的Android开源计步器
- 张爱玲经典爱情语录大全
热门文章
- MATLAB三维曲面绘图你不得不知道的...
- MATLAB 查看程序执行内存最大使用值
- 【Python刷题】_1
- Adaboost方法分类新闻数据
- [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform
- spring Transaction Management --官方
- java实现迷宫算法--转
- 基于迁移学习的反欺诈方法研究
- Spring Boot实战系列《六》:人事管理系统的登录设计
- 再理解RankNet算法