运维SRE-07 系统管理体系-进程管理

系统管理体系之进程管理

什么是进程?
  • 进程process:运行起来的程序,命令,软件
  • 程序软件:存放在磁盘上面的程序代码
进程,程序,守护进程(服务)
  • 进程process:运行起来的程序,命令,软件
  • 程序软件:存放在磁盘上面的程序代码
  • 守护进程(服务):持续运行的进程。这些一般是系统必备进程(服务软件),eg;网络``日志``定时任务``其他
  • 服务/守护进程:通过systemctl控制
进程的生命周期

1)进程正常处理流程:
1.子进程在处理任务代码时,父进程会进入等待状态中…
2.子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源。
3.异常情况:如果子进程在处理任务过程中异常退出,而父进程没有回收子进程的资源。

2)僵尸进程:

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
在这里插入图片描述

3)孤儿进程:
孤儿进程指的是其父进程执行完成后或被终止后继续运行的一类进程
孤儿进程会被系统直接接管(systemd进程)
在这里插入图片描述

4)异常进程处理方案:
a)僵尸进程

  • 处理,通过正常kill命令无法杀掉
  • 处理方案:结束他的父进程,最终方案重启linux系统

b)孤儿进程

  • 重启对应服务

c)模拟:了解

  • 孤儿进程
#准备
pkill nginx 
ps -ef |grep nginx 
yum install -y nginx 
#模拟
systemctl  start nginx  

[root@hb-sre-001 bin]# systemctl start nginx
[root@hb-sre-001 bin]# pstree -p
           ├─nginx(13577)───nginx(13579) # nginx正常运行,13577父进程 13579子进程
[root@hb-sre-001 bin]# kill -9 13577 #强制结束父进程
[root@hb-sre-001 bin]# pstree -p	 #子进程成为孤儿被系统进程systemd接管.
           ├─nginx(13579)
           
把子进程kill掉,重启服务即可
  • 僵尸进程
vim zombine.c
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*
 desc: 用于模拟僵尸进程.代码. oldboyedu.com
*/
int main(int argc, char *argv[])
{
pid_t pid;
pid = fork();
if (pid == 0) {
int iPid = (int)getpid();
fprintf(stderr,"I am child,%d\n",iPid);
sleep(1);
fprintf(stderr, "Child exits\n");
return EXIT_SUCCESS;
}
int iPid = (int)getpid();
fprintf(stderr,"I am parent,%d\n",iPid);
fprintf(stderr, "sleep....\n");
sleep(600);
fprintf(stderr, "parent exits\n");
return EXIT_SUCCESS;
}
#编译c语言代码,生成命令
gcc zombine.c  -o zombine.bin
#检查
[root@oldboy81-golden-lnb /oldboy]# ll zombine.*
-rwxr-xr-x. 1 root root 8648 Mar 23 10:35 zombine.bin
-rw-r--r--. 1 root root  591 Mar 23 10:35 zombine.c
#开始模拟
root@oldboy81-golden-lnb /oldboy]# ./zombine.bin 
I am parent,30037
sleep....
I am child,30038
Child exits
#再开个窗口 进行操作
##检查僵尸进程
[root@oldboy81-golden-lnb ~]# ps aux |grep Z
USER       PID %CPU %MEM   VSZ   RSS TTY     STAT START   TIME COMMAND
root      30055  0.0  0.0      0     0 pts/0   Z+   10:36   0:00 [zombine.bin] <defunct>  #这个就是僵尸进程
root      30169  0.0  0.0 112808   948 pts/1   R+   10:38   0:00 grep --color=auto Z

##尝试结束僵尸进程
kill
kill -9
##尝试结束僵尸进程父进程.
[root@oldboy81-golden-lnb ~]# pstree -p |grep zombine 
           |-sshd(1473)-+-sshd(1731)---bash(1735)---zombine.bin(30054)---zombine.bin(30055)
kill 30054
##检查结果
[root@oldboy81-golden-lnb ~]# pstree -p |grep zombine 
[root@oldboy81-golden-lnb ~]# ps aux |grep Z
USER       PID %CPU %MEM   VSZ   RSS TTY     STAT START   TIME COMMAND
root      30247  0.0  0.0 112808   948 pts/1   R+   10:40   0:00 grep --color=auto Z
进程监控指令
  • ps
  • top

1)ps 显示进程信息(静态)

#
ps -ef #简单信息 pid ppid
ps aux

在这里插入图片描述
在这里插入图片描述

ps aux每一行含义

每一列
第1列:User进程属于用户
第2列:PID进程号
第3列:%CPUcpu使用率
第4列:%MEM内存使用率
第5列:VSZ进程占用虚拟内容的大小(KB)
第6列:RSS进程占用物理内存大小(KB)
第7列:TTY用户使用终端
第8列:STAT进程状态
第9列:START进程启动时间
第10列:TIME进程占用CPU时间
第11列及最后:COMMAND进程名字(命令,选项…)[]括起来的是内核进程,其他是系统进程systemd pid是第1个进程

b)ps aux中VSZ和RSS的区别

#VSZ: Virtual size   进程占用虚拟内存大小.
虚拟内存=swap+物理内存
#RSS: resident size 进程占用物理内存大小.

c)ps aux中的进程状态

STAT基本状态描述STAT状态+符号(附加状态)描述
R(running)进程运行s进程是控制进程,Ss进程的领导者,父进程
S可中断进程(可以随时停止)<进程运行在高优先级上,S<优先级较高的进程
T(terminate)进程被暂停(挂起)ctrl+zN进程运行在低优先级上,SN优先级较低的进程
D不可中断进程(IO读写)+当前进程运行在前台,R+该表示进程在前台运行
Z(zombie)僵尸进程l(小写L)进程是多线程的,Sl表示进程是以线程方式运行(与程序)
# 线程 vs 进程概述
进程:运行起来的程序或命令,用于在内存中占有资源与空间
线程:进程内部,实际处理用户请求,数据,软件/服务是否有线程,与开发,代码相关

d)ps aux 中进程状态-组合与案例

  • Linux比较常见的进程状态
    R+
    R
    S
    T
    D
    Ss
    S<
    Ssl

  • 统计每个进程类型的数量

[root@hb-sre-001 bin]# ps aux | awk '{print $8}'|sort |uniq -c
      1 R
      3 R+
     25 S
     53 S<
      1 S+
      2 SN
     11 Ss
      1 Ss+
      6 Ssl
      1 S<sl
      1 STAT

2)top显示进程信息(动态)
在这里插入图片描述
在这里插入图片描述

a)cpu相关

任务含义
Tasks:129total当前进程总数
1 running正在运行的进程数
128sleeping睡眠的进程数
0 stopped停止的进程数
0 zombie僵尸进程数
cpu相关:%Cpu(s):0.7ususer系统用户进程使用cpu百分比(压缩,转码,加密)
0.7sysystem内核中的进程占用cpu百分比,通常内核是于硬件进行交互(硬件设备,网卡,硬盘…)
ni优先级高的进程占用的百分比
98.7 ididle 空闲cpu的百分比
0.0 waiowait CPU等待IO完成的时间(用户请求资源很多,磁盘,)
0.0 hi硬中断,占的百分比
0.0 si软中断,占的百分比
0.0 ststeal 比如虚拟机占用物理cpu时间的百分比
  • 中断: 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕
    后又返回原被暂停的程序继续运行。

b)内存相关

  • Linux内存机制概述:内存被吃了。
[root@hb-sre-001 ~]# dd if=/dev/zero of=/tmp/big bs=1M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,3.32731 秒,315 MB/秒
[root@hb-sre-001 ~]# free -g
              total        used        free      shared  buff/cache   available
Mem:              1           0           0           0           1           1
Swap:             1           0           1
[root@hb-sre-001 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        216M         73M        9.6M        1.5G        1.4G
Swap:          2.0G          0B        2.0G


#这是linux正常的机制.
#linux会把我们用过文件,内容临时存放在内存中.
#这种存放会占用内存空间,存放专用区域 buffer/cache区.
#所以基于这个特点:当前实际可用的内存: free+buffer/cache ~ available(可用内存)
参考网站: https://www.linuxatemyram.com/
  • buffer/cache(内存)
buffer 缓冲区 内存中一块区域,主要用来加速写入. 写buffer 写缓冲
cache   缓存区 内存中一块区域,主要用来加速读取, 读cache   读缓存
  • 未来架构优化的目标了解: 尽可能让用户访问缓存中的数据.(内存,软件…)

2)ps和top实战-案例
a)案例01 检查系统进程状态与信息(crond)

ps -ef|grep crond
ps aux|grep crond

b)案例02 按照树形结构查看进程信息

pstree # -p 显示进程及pid信息

ps auxf #以树形显示进程信息,详细信息
root       1068  0.0  0.2 112900  4352 ?        Ss   9月06   0:00 /usr/sbin/sshd -D
root      15651  0.0  0.3 158904  5604 ?        Ss   14:40   0:00  \_ sshd: root@pts/0
root      15655  0.0  0.1 116156  2812 pts/0    Ss   14:40   0:00      \_ -bash
root      15906  0.0  0.1 155584  1952 pts/0    R+   15:58   0:00          \_ ps auxf
root       1069  0.0  0.2 222740  5372 ?        Ssl  9月06   0:09 /usr/sbin/rsyslogd -n
root       1286  0.0  0.1  89708  2212 ?        Ss   9月06   0:00 /usr/libexec/postfix/master -w
postfix    1294  0.0  0.2  89880  4088 ?        S    9月06   0:00  \_ qmgr -l -t unix -u
postfix   15642  0.0  0.2  89812  4080 ?        S    14:39   0:00  \_ pickup -l -t unix -u
root       3753  0.0  0.0 126384  1676 ?        Ss   06:32   0:00 /usr/sbin/crond -n

c)案例03 根据要求,只显示某些内容

# 方法01 通过ps aux/ps -ef + awk处理.
ps aux |awk  '{print $1,$2,$3,$4,$11}'

# 方法02 
ps -xo user,pid,%cpu,%mem,command

  • 取出索要内容,不显示标题.
#方法01 通过ps aux/ps -ef + awk处理.
ps aux |awk  'NR>1 {print $1,$2,$3,$4,$11}'
#方法02 通过ps命令选项实现
ps  --no-heading  -xo user,pid,%cpu,%mem,command

d)案例04 取出某一个服务(crond)的进程信息(pid,%cpu,%mem,command)

ps  --no-heading  -xo user,pid,%cpu,%mem,command |grep crond 

[root@oldboy81-golden-lnb ~]# ps --no-heading -xo user,pid,%cpu,%mem,command |grep crond 
root       1046  0.0  0.0 /usr/sbin/crond -n
root      46223  0.0  0.0 grep --color=auto crond

e)案例05 取出所有进程中内存使用率最高的前5

#方法01 
ps aux |sort -rnk4 |head -5

#方法02
ps aux --sort=%mem |tail -5
ps aux --sort=-%mem |head
top实战案例

a) 案例01:top基础使用与快捷键

#默认按照cpu使用率排序: P  
#按照内存使用率排序 : M
#立刻刷新: 空格
#进阶用法: top输入z进入颜色模式 按 x 标记出当前是按照哪列排序.
 shift + > 向右
 shift + < 向左
 
 
  	
#其他了解
#top熟悉了解的快捷键
h 查看帮出
z   以彩色信息展示 x   
1 显示所有CPU的负载
s 设置刷新时间
b 高亮现实处于R状态的进程
M 按内存使用百分比排序输出
P 按CPU使用百分比排序输出
R 对排序进行反转
f 自定义显示字段
k kill掉指定PID进程
W 保存top环境设置 ~/.toprc

b)案例02:非交互模式

# -p 只显示某个进程的信息 -p pid 
# -b 批量处理模式,top命令结果批量写入文件 一般配合-n 方便把结果保存,方便其他命令二次处理
# -n 批处理模式,显示几次
# -d 修改top命令刷新间隔 -d 1

#01 通过-p查看指定进程信息
[root@oldboy81-golden-lnb ~]# top -p 1046

#02 非交互模式 -b   批处理模式,一般用于取出想要内容,写入到文件.
ps -ef |grep crond 
定时任务的pid是 1046
top -b -n1 -p 1046

c)案例03:显示多线程服务的线程信息

ps aux |grep mysql

top -p 34520

top -Hp 34520
总结
  • 什么是进程,程序,守护进程
  • 僵尸进程,孤儿进程以及如何检查,如何处理
  • ps 和 top核心部分含义
  • 常见进程状态:R + R Ss Ssl T D
  • 如何查看内存大小free``top
  • 写buffer 和 读 cache
  • ps 和 top应用案例

进程管理-后台运行

概述
前台/后台基本介绍特点
前台占用我们窗口(终端)(进程标记+)始终开启窗口(终端),如果终端断开,操作就结束了
后台一般是系统服务软件即使连接断开也不会影响操作
常用方案
后台运行方案概述应用场景
&(and)让程序进程后台运行大部分命令后台执行,缺点输出到屏幕,但是可以通过重定向方法保存输出
ctrl+z然后bg后台挂起,bg继续后台运行1.前台进程,转入后台运行.
2.结束顽固的服务/命令,ctrl + z ,bg,kill
screen创建虚拟空间,让服务/命令在这个空间中运行,相当于是后台运行更稳定的后台运行命令/进程方式.
screen里面运行的命令,外部看不到
nohup xxxx &与第1个类似,会生成日志一般让后台运行的生成日志

1)&符

2)ctrl+z 然后键盘按bg进入后台挂起

3)screen

  • 创建一个窗口,运行指定的命令,(相当于是后台运行)
#01安装
yum install -y screen
#02 案例 01 让命令/进程通过screen运行 ,命令运行结束自动退出 screen窗口
screen tar zcvf /tmp/etc.tar.gz /etc/
#如果执行命令过程中出现连接断开,screen保存.
screen -ls #查看保存会话(窗口)
screen -r 窗口id   #恢复
#03 案例02  
screen 
for n in {1..10000}
do
   echo $n
   sleep 1
done
断开窗口
查看
screen -ls
恢复窗口
screen -r
#补充命令
screen 创建screen窗口
screen -ls #查看窗口
screen -r  #恢复窗口
screen -S 创建窗口的时候指定名字.
手动退出窗口,窗口还会继续运行.
ctrl+a 然后按d

4)nohup + &
后台执行,日志写入nohup

6)任务管理

  • fg,bg
  • jobs查看当前通过&,ctrl + z进入后台运行,挂起进程

进程管理-杀手三人组、

概述
命令特点区别应用场景
kill结束进程根据进程pid,结束进程大部分时候推荐使用,防止误杀
pkill结束进程根据进程名结束进程(过滤,模糊匹配)用于批量结束包含指定名字进程(模糊过滤)
killall结束进程进程名字结束进程用于批量结束包含指定名字进程(精确过滤)

1)kill
2)pkill

#根据进程名字结束进程.
[root@oldboy81-golden-lnb ~]# ps aux |grep sleep 
root       4866  0.0  0.0 108052   352 pts/1   S    10:50   0:00 sleep 999
root       4867  0.0  0.0 108052   356 pts/1   S    10:50   0:00 sleep 99
root       4868  0.0  0.0 108052   352 pts/1   S    10:50   0:00 sleep 9
root       4870  0.0  0.0 112808   968 pts/0   R+   10:50   0:00 grep --color=auto sleep
[root@oldboy81-golden-lnb ~]# pkill sleep 
[root@oldboy81-golden-lnb ~]# ps aux |grep sleep 
root       4879  0.0  0.0 112808   968 pts/0   R+   10:50   0:00 grep --color=auto sleep
#使用需要慎重.
#尽可能多些进程名字及信息.
#如果写的进程信息比较少,可能会误杀.
pkill -f sleep.sh  #-f根据进程命令,选项,参数,进行过滤与删除.
#pkill sleep 
执行过程
1. ps -ef |grep sleep
2. 进程中以sleep开头命令
3. 叫给pkill 结束 .
kill 取你狗命 结束你的生命
pkill 取你狗命 你和你的狗的命.

3)killall

精确匹配进程名字.(命令部分)
不会误杀.
#慎用. 批量结束指定进程  
ps aux |grep sleep |awk '{print $2}' |xargs  kill

系统管理体系-平均负载

平均负载概述
  • 负载:衡量系统繁忙程度指标。用于初步判断系统运行情况。
  • 平均数(平均负载)
[root@hb-sre-001 ~]# uptime
 23:03:11 up 1 day, 19:23,  2 users,  load average: 0.00, 0.01, 0.05
                                                                  平均负载:  1分钟 5分钟 15分钟
衡量系统负载高低(结论)
  • 系统负载数值与当前系统系统的cpu核心总数对比。越接近cpu核心总数,负载越高。接近于cpu核心总数70%-80%
  • 查看cpu核心总数:lscop top按1
系统负载背后原理

那到底如何理解平均负载:平均负载是指单位时间内,系统处于可运行状态(R,S)和不可中断状态(D)的平均进程数,也就是平均活跃进程数
可运行状态(R,S):需要消耗cpu资源
不可中断状态(D):需要消耗io资源
PS:平均负载与CPU使用率并没有直接关系

系统负载高原因
  • 常见:cpu使用导致负载高
  • 常见:大量io消耗导致系统负载高

0)模拟使用命令stress

  • 对系统进行压力测试,测试cpu,mem,磁盘…
Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

--cpu 测试cpu
--io  测试io
--vm  测试内存 --vm-byte 128M 内存读写占用多少内存空间
--timeout 10s 测试持续10秒

1)模拟cpu使用率高导致系统负载高

stress --cpu 2 --timeout 99

top - 11:56:43 up  3:13,  3 users, load average: 2.11, 1.11, 0.47
Tasks: 113 total,   3 running, 110 sleeping,   0 stopped,   0 zombie
%Cpu(s): 99.7 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2027868 total,  1328468 free,   230916 used,   468484 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1635644 avail Mem 
   PID USER     PR NI   VIRT   RES   SHR S %CPU %MEM     TIME+ COMMAND                                       
                         
  5212 root      20   0    7312    100      0 R 49.8  0.0   0:51.45 stress                                       
                          
  5211 root      20   0    7312    100      0 R 49.5  0.0   0:51.45 stress
  
#占用cpu导致系统负载高.

在这里插入图片描述

2)模拟io使用率高导致系统负载高

stress  --hdd 2 --hdd-bytes 2g

#运行一段时间后 查看top命令 wa(iowait )
 [root@oldboy81-golden-lnb ~]# top -b -n1   
top - 12:03:59 up  3:20,  4 users, load average: 3.84, 2.38, 1.27
Tasks: 118 total,   2 running, 116 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us, 14.3 sy,  0.0 ni,  0.0 id, 78.6 wa,  0.0 hi,  7.1 si,  0.0 st
KiB Mem :  2027868 total,    69700 free,   222520 used,  1735648 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1629328 avail Mem 
   PID USER     PR NI   VIRT   RES   SHR S %CPU %MEM     TIME+ COMMAND
   287 root      20   0       0      0      0 D  6.7  0.0   0:09.17 kworker/u256:2
  5282 root      20   0    8212   1128     32 D  6.7  0.1   0:15.76 stress
  5283 root      20   0    8212   1128     32 D  6.7  0.1   0:15.61 stress
  
#磁盘io读写导致系统负载高. 
系统负载高排查流程

思路/流程:

  • 发现Linux系统负载高(未来通过监控软件得知)现在通过top/uptime/w命令查看

    • cpu导致
    • 磁盘IO导致
  • 根据具体原因然后解决

  • 当前目标:通过top命令及信息初步判断cpu还是磁盘导致的负载高即可

超级详细流程

系统负载高完全排坑指南
在这里插入图片描述
在这里插入图片描述

  • top命令检查cpu还是io导致的负载高
vmstat辅助排查系统负载高命令
#分析是cpu还是io导致的负载高
vmstat
vmstat 1 10 #每一秒执行1次 一共10次.
# 
vmstat 中第1列 r和第2列的b表示什么 
       r: The number of runnable processes (running or waiting for run time).
          当前可运行的进程数量(正在运行中或准备要运行) 类似于进程状态R
       b: Number of processes blocked waiting for I/O to complete.
          正在进行io进程(不可中断进程)
rb与负载高关系(参考)
r数量高,很可能是cpu占用导致系统负载高.
b数量高,很可能是io占用导致系统负载高.

#待讲解与使用排查命令
iostat
pidstat 
nstat
系统管理体系-服务管理systemctl
  • systemctl system control系统控制命令,C7(红帽7)

1)服务启动/关闭/重启

注意: 李导建议: 使用这个命令前,安装系统自动补全增强工具.

需要配置epel源才能安装.

bash-completion  bash-completion-extras

yum install -y tree vim wget  bash-completion  bash-completion-extras  lrzsz  net-tools sysstat  iotop iftop htop unzip nc nmap telnet bc  psmisc httpd-tools  bind-utils nethogs expect	
  • 使用
案例01 开启服务/关闭/重启
systemctl stop network      #关闭 
systemctl start network     #开启
systemctl restart network   #重启

常用服务: network网络服务 sshd远程连接服务 nginx网站服务 firewalld 防火墙服务

2)开机自启动

开机自启动:在Linux开机的时候服务/命令可以自动运行

案例02 配置服务的开机自启动
systemctl start  firewalld    #
systemctl disable  firewalld  #让防火墙开机关闭.
systemctl enable  firewalld

此时此刻: 防火墙是否运行?  运行
重启Linux系统后: 防火墙是否运行? 关闭 


彻底关闭防火墙 
systemctl stop   firewalld
systemctl disable  firewalld

检查服务是否运行: crond
systemctl is-active   crond

检查服务是否开机自启动: crond
systemctl  is-enabled crond 

运行级别

  • 运行级别:(runlevel/target) Linux系统的不同状态。(命令行模式(状态)、图形化界面模式(状态))
详解

在这里插入图片描述

运行级别(Centos 6.x)c7
0poweroff关机
1rescue单用户模式,救援模式.(root密码忘记,linux无法启动)
2multi-user无网络的,但用户模式(无NFS)
c7:文本模式,命令行模式,多用户模式
3multi-user命令行模式,文本模式(工作必备,工作默认)
4multi-user未使用
c7:文本模式,命令行模式,多用户模式
5graphical图形化界面模式,桌面模式,x11(需要安装对应环境)如果想尝试请安装使用ubuntu
6reboot重启
修改运行级别
#01 查看当前系统运行级别
systemctl get-default

#02 修改运行级别
systemctl set-default graphical.target

启动流程

详细流程
  • 按下开关后一直到欢迎界面结束
    在这里插入图片描述
  1. 开机自检(BIOS自检)
  2. MBR/GPT引导系统启动
  3. GRUB菜单(选择内核,进入救援模式)
  4. 加载内核镜像(加载/boot下的内容到内存中)
  5. 运行第1个进程:systemd
  6. 读取运行级别:多用户模式即可
  7. 系统初始化:ip,主机名,fstab挂载…
  8. 启动服务(并行)
  9. 显示登录界面(getty 运行Login界面)

如何找回root密码(root密码忘记怎么办)

运维plan b(备用方案)
  • 配置普通用户,给普通用户配置sudo权限
  • 存放密码工具:keepass
  • 未来:配置密钥认证
处理流程
  • 重新设置root密码需要重启服务器
  • 详细流程:在重启服务器后进入grub菜单进行操作

a)方法01 本地救援模式(单用户模式)

  • 如何进入修改
    在这里插入图片描述
    在这里插入图片描述

    修改完成后,按下 ctrl + x(按照当前的配置启动系统),进入单用户(救援模式)

进入到linux命令行(无法使用远程连接)
默认是root用户(不需要输入密码)
passwd #使用passwd修改密码即可  
删除passwd命令锁文件
rm -f /etc/.pwd.lock
重启即可.
vim /etc/passwd  #或者直接通过vim 修改文件 然后删除root的x
部分 root就没有密码.

b)方法02 通过光盘启动系统

  • 通过光盘或u盘启动linux
  1. 光盘、U盘是否插入系统
  2. 通过光盘、U盘启动系统
  3. 进入光盘救援模式
  4. 重新设置密码(清空root密码)
  • 光盘、U盘是否插入系统
    在这里插入图片描述

  • 通过光盘、U盘启动系统

    • logo页面(vmware) 按esc,选择光盘启动。
      在这里插入图片描述
      在这里插入图片描述
  • 进入光盘救援模式
    选择 Troubleshooting 解决故障
    在这里插入图片描述

    选择 rescue (救援)
    在这里插入图片描述

    进入救援模式后的选择
    在这里插入图片描述

    如何操作硬盘的系统和数据。 chroot /mnt/sysimage 直接操作系统磁盘的数据,目录结构一致。 在这里插入图片描述

    修改密码
    在这里插入图片描述

    退出: ctrl+d *2次

救援模式小结
  • 非必须不推荐,操作系统
    • 本地救援模式(找回root密码,fstab改错了无法开机…)
    • 光盘救援模式(彻底无法进入linux,本地救援模式无法使用.)
定时任务
目标: 熟练书写定时任务规则,实现定时/重复执行指令/脚本.
应用场景: 定时任务+脚本备份,日常操作.

定时任务: linux闹钟,在指定的(日期,时间)指定指定的任务. 重复性,经常任务交给定时任务.
定时任务的使用
  1. 预备姿势 (服务与配置)
    a) 软件
cronie(软件包)
crond(服务名)

b)配置文件
核心配置文件:

定时任务配置文件
用户定时任务:
/var/spool/cron/rootroot用户名,以用户名命名的配置文件.
系统定时任务:
/etc/cron.daily/每天运行(系统)
/etc/cron.hourly/每小时运行(系统)
/etc/cron.weekly/每周运行(系统)
/etc/cron.monthly/每月运行(系统)
/etc/crontab定时任务的配置文件(很少用)
/etc/cron.deny拒绝哪些用户使用定时任务

c)定时任务管理命令

  • visudo ===> /etc/sudoers
  • crontab ===> /var/spool/cront/用户名(root)
定时任务管理命令格式
crontab -l (list)cat /var/spool/cron/root 查看定时任务
crontab -e (edit)vi /var/spool/cron/root 编辑定时任务
表示整点,其他日期的时候没有表述是哪个分钟,一般写个00分钟即可 12点整 晚上12点
如果没有加上则表示每分钟.

3)定时任务时间其他格式(定时任务时间中可以支持特殊符号)

定时任务特殊符号
* 星号所有,全部. 比如: *在分钟位置上,表示0-59,每分钟. *在小时位置上,*表示0-23,每小时.
/ 斜线每隔多久运行1次 */2 * * * * #每2分钟运行1次. #每2分钟,每隔2分钟一样.
- 减号从哪里来到哪里去,表示时间范围每天早上9-中午12点,每个小时.运行 cmd命令
, 逗号独立,互不相干时间. 每天半夜12点,上午7点,下午14点,运行cmd命令
每天早上9-中午12点,每个小时.运行 cmd命令.
00 09-12 * * * cmd
每天半夜12点,上午7点,下午14点,运行cmd命令
00 00,07,14 * * * cmd

4)案例
a)案例01:每分钟输出oldboy追加到/tmp/name.log中

定时任务书写流程:
1. 根据题目选择命令,测试命令/脚本,进行测试.
2. 对应的命令写入到定时任务的配置文件中(crontab -e/-l)
3. 等待运行与检查结果与查看定时任务日志.
#1. 根据题目选择命令,测试命令/脚本,进行测试.
echo oldboy >>/tmp/name.log
#2. 对应的命令写入到定时任务的配置文件中
crontab -l
* * * * * echo oldboy >>/tmp/name.log
cat /tmp/name.log

查看定时任务日志
/var/log/cron

b)案例02:每2分钟同步系统时间ntpdate

定时任务书写流程:
1. 根据题目选择命令,测试命令/脚本,进行测试.
2. 对应的命令写入到定时任务的配置文件中(crontab -e/-l)
3. 等待运行与检查结果与查看定时任务日志.
#1. 根据题目选择命令,测试命令/脚本,进行测试.
ntpdate ntp1.aliyun.com
#命令ntpdate 可以通过date命令检查结果.
#2. 对应的命令写入到定时任务的配置文件中(crontab -e/-l)
书写定时任务.
#2. tongbu time by lidao996 20221111
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com
#3. 等待运行与检查结果与查看定时任务日志.
date -s "202220202" #修改时间,看时间是否被定时任务同步回来了.
定时任务日志检查是否执行.

c)案例03:每天晚上12点整点备份/etc/目录到/backup下面,每天的备份不同

定时任务书写流程:
1. 根据题目选择命令,测试命令/脚本,进行测试.
2. 对应的命令写入到定时任务的配置文件中(crontab -e/-l)
3. 等待运行与检查结果与查看定时任务日志.
1. 根据题目选择命令,测试命令/脚本,进行测试.
   1) 测试命令
   mkdir -p /backup/   #创建备份目录
   date +%F        #显示年-月-日格式 过程而已
   tar -cvzf /backup/etc-`date +%F`.tar.gz /etc/   #打包备份命令,需要写入到脚本中
    2) 测试脚本(初级脚本,命令大礼包)
    mkdir -p /server/scrips/   #创建脚本目录
    cat /server/scrips/01.bak-etc.sh   #脚本内容
    tar -cvzf /backup/etc-`date +%F`.tar.gz /etc/
            sh /server/scrips/01.bak-etc.sh
   	
2. 对应的命令写入到定时任务的配置文件中 (包含检测过程)
1) (每分钟)
#3. backup etc   
* * * * *  sh /server/scrips/01.bak-etc.sh
2) 如果每分钟没有问题,再修改为指定时间半夜12点执行.
#3. backup etc   
00 00 * * *  sh /server/scrips/01.bak-etc.sh
为何使用脚本:
  • 大部分命令,除了非常简单echo ,ntpdate ,其他命令建议放入脚本中.
  • 初级使用脚本,命令大礼包.
  • 脚本进阶使用,在脚本中使用变量.

定时任务书写规范及案例

1)书写流程

#01. 根据要求选出对应的命令,书写脚本,测试. 
#02. 写入定时任务
1)先按照每分钟执行
2)再修改为对应的时间
#03. 测试,检查
1)看结果
2)看日志

2)为何用绝对路径?

现象: 定时任务中命令或脚本中的命令. 非/bin目录下面的命令,使用绝对路径.
原因: 定时任务在运行命令脚本的时候,只能识别位于/bin和/usr/bin的命令.,导致位于其他目录的命令,定时任务无法识别.

解决: 
解决方案01) 非/bin/命令,就都用绝对路径.
解决方案02) 在脚本的开头,重新定义或加载下命令的路径.
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
解决方案02) 在脚本的开头,重新定义或加载下命令的路径.
. /etc/profile

[root@hb-sre-001 scrips]# cat 03.sys-info.sh 
. /etc/profile    #加载命令路径否则定时任务识别不了ip命令
date
ip a s ens33

3)灵异的邮件提示:You have new mail in /var/spool/mail/root

现象: 突然出现一个你有新邮件提示.
原因: 定时任务中命令或脚本有输出,默认通过邮件发送给root用户,
     如果系统中的邮件服务开启:
         root进行操作的时候命令就会有收到新邮件的提示. You have new mail in /var/spool/mail/root
     如果系统中的邮件服务关闭,
       你不会收到邮件.
       这样系统憋得很难受,系统会把没有发送出去的邮件临时存放起来. 日积月累,会有大量小文件. 最后导致inode不足.
        
解决方法: 让定时任务执行命令或脚本的输出(正确,错误),定向到空(黑洞/dev/null).        
sh /server/scrips/01.bak-etc.sh &>/dev/null        #定向到黑洞(标准输出 标准错误输出)
sh /server/scrips/01.bak-etc.sh >/dev/null  2>&1   #定向到黑洞(标准输出 标准错误输出)

4)书写定时任务注意事项

  • 增加注释与说明
  • 书写定时任务的时候尽量使用脚本,提高要求(使用变量)
  • 定时任务执行命令或脚本,加上定向到空或追加到文件.
  • 定时任务文件的路径,使用绝对路径.
  • 调试脚本的时候,根据我们书写流程进行调试(提高要求:调试脚本可以使用sh -x)
  • ⚠ 书写定时任务:大象放冰箱一步一步来.
  • 25
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值