进程和计划任务

发布时间 2023-11-12 23:28:55作者: 一个低调的wy

进程和计划任务

1. 进程

1.1为什么要学进程?

因为进程是非常耗费系统资源,这是运维调优系统的对象之一


1.2 基本概念

1.2.1 程序

程序是什么

没有运行的特定代码是,程序


程序的运行过程是什么样的

程序存放在硬盘中,当系统运行程序时,会拷贝程序代码存放到内存中的随机位置

这个拷贝到内存中的程序就是,进程

进程就是程序的副本

每运行一个程序,就会占用一定的内存空间。

当内存满了,就无法运行新的程序


内存满了会出现什么现象?

电脑死机

服务访问异常,无法访问百度、京东、nginx等服务


程序的作用是什么

产生进程


1.2.2 进程

进程是什么?

运行中的程序,进程是资源分配的单位


内存中,谁占资源最多?

进程,所以我们需要对进程进行管理,也就是进程的全生命周期、


什么是进程的全生命周期?

对进程的诞生、运行、消失的管理,管理什么

​ 当进程运行出现问题怎么办

​ 当进程应该消失,但是没有消失,怎么办(僵尸进程)


进程的特征

​ 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的

​ 并发性:任何进程都可以同其他进程一起并发执行

​ 独立性:进程是系统进行资源分配和调度的一个独立单位

​ 结构性:进程由程序、数据和进程控制块三部分组成


线程

进程的真正执行者

一个进程可以有多个线程


协程

协程在线程里面,规定了谁先运行

开发人员向操作系统规定了,当有多个线程时,线程的运行先后顺序

一个线程可以有多个协程


程序、进程、线程的关系

image-20231106155828680

在进程中,线程1、线程2,谁先运行,是谁说了算 --操作系统


CPU的运行原理(CPU的时间分片)

​ 当cpu只有1核,需要处理听音乐(1)、写文档(2)、聊天(3)多个任务时,cpu会进行时间分片,按编号执行(123 123 123),因为cpu分片时间间隔很短,只有毫秒级,人无法感觉出来。所以,让我们感觉到是多个任务并行处理(cpu时间分片:宏观上--并行处理,微观上--按顺序处理)


进程在使用内存时,会出现的问题?

内存泄漏 Memory Leak

当在内存中用"malloc"或"new"申请了一块内存空间,但是没有用free或delete将内存空间释放,这就会导致这块内存一直处于被占用状态

内存溢出 Memory Overflow

当程序向内存申请了1G的空间,但是在这个空间中写入超过1G的数据时,就会造成内存溢出

内存不足 OOM Out Of Memory

内存用完了,这在java程序中比较常见,这时候系统会选择一个进程将之杀死

在日志"messages"中看到类似下面的提示

Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child

运维故障案例:当出现内存不足,该怎么解决?
1. 看是否内存条不足
2. 看看还是出现程序死循环

查看程序使用内存的详细情况

pmap  pid号
pmap 704


[root@localhost opt]# pmap 704
704:   nginx: master process /opt/apps/nginx/sbin/nginx    # nginx主进程
0000000000400000    636K r-x-- nginx
000000000069e000      4K r---- nginx
000000000069f000     68K rw--- nginx
00000000006b0000    128K rw---   [ anon ]
000000000259a000    264K rw---   [ anon ]
00007f86cd108000     48K r-x-- libnss_files-2.17.so
00007f86cd114000   2044K ----- libnss_files-2.17.so
00007f86cd313000      4K r---- libnss_files-2.17.so
00007f86cd314000      4K rw--- libnss_files-2.17.so
00007f86cd315000     24K rw---   [ anon ]
00007f86cd31b000      8K r-x-- libfreebl3.so
00007f86cd31d000   2044K ----- libfreebl3.so
00007f86cd51c000      4K r---- libfreebl3.so
00007f86cd51d000      4K rw--- libfreebl3.so
00007f86cd51e000   1760K r-x-- libc-2.17.so
00007f86cd6d6000   2048K ----- libc-2.17.so
00007f86cd8d6000     16K r---- libc-2.17.so
00007f86cd8da000      8K rw--- libc-2.17.so
00007f86cd8dc000     20K rw---   [ anon ]
00007f86cd8e1000     84K r-x-- libz.so.1.2.7
00007f86cd8f6000   2044K ----- libz.so.1.2.7
00007f86cdaf5000      4K r---- libz.so.1.2.7
00007f86cdaf6000      4K rw--- libz.so.1.2.7
00007f86cdaf7000    384K r-x-- libpcre.so.1.2.0
00007f86cdb57000   2048K ----- libpcre.so.1.2.0
00007f86cdd57000      4K r---- libpcre.so.1.2.0
00007f86cdd58000      4K rw--- libpcre.so.1.2.0
00007f86cdd59000     32K r-x-- libcrypt-2.17.so
00007f86cdd61000   2044K ----- libcrypt-2.17.so
00007f86cdf60000      4K r---- libcrypt-2.17.so
00007f86cdf61000      4K rw--- libcrypt-2.17.so
00007f86cdf62000    184K rw---   [ anon ]
00007f86cdf90000     92K r-x-- libpthread-2.17.so
00007f86cdfa7000   2044K ----- libpthread-2.17.so
00007f86ce1a6000      4K r---- libpthread-2.17.so
00007f86ce1a7000      4K rw--- libpthread-2.17.so
00007f86ce1a8000     16K rw---   [ anon ]
00007f86ce1ac000      8K r-x-- libdl-2.17.so
00007f86ce1ae000   2048K ----- libdl-2.17.so
00007f86ce3ae000      4K r---- libdl-2.17.so
00007f86ce3af000      4K rw--- libdl-2.17.so
00007f86ce3b0000    132K r-x-- ld-2.17.so
00007f86ce5b8000     20K rw---   [ anon ]
00007f86ce5cf000      4K rw-s- zero (deleted)
00007f86ce5d0000      4K rw---   [ anon ]
00007f86ce5d1000      4K r---- ld-2.17.so
00007f86ce5d2000      4K rw--- ld-2.17.so
00007f86ce5d3000      4K rw---   [ anon ]
00007ffff43c7000    132K rw---   [ stack ]
00007ffff43ee000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total            20520K
[root@localhost opt]# 


[root@localhost opt]# pmap 705
705:   nginx: worker process           # nginx工作进程,子进程
0000000000400000    636K r-x-- nginx
000000000069e000      4K r---- nginx
000000000069f000     68K rw--- nginx
00000000006b0000    128K rw---   [ anon ]
000000000259a000    264K rw---   [ anon ]
00000000025dc000    216K rw---   [ anon ]
00007f86cceff000     32K r-x-- libnss_sss.so.2
00007f86ccf07000   2044K ----- libnss_sss.so.2
00007f86cd106000      4K r---- libnss_sss.so.2
00007f86cd107000      4K rw--- libnss_sss.so.2
00007f86cd108000     48K r-x-- libnss_files-2.17.so
00007f86cd114000   2044K ----- libnss_files-2.17.so
00007f86cd313000      4K r---- libnss_files-2.17.so
00007f86cd314000      4K rw--- libnss_files-2.17.so
00007f86cd315000     24K rw---   [ anon ]
00007f86cd31b000      8K r-x-- libfreebl3.so
00007f86cd31d000   2044K ----- libfreebl3.so
00007f86cd51c000      4K r---- libfreebl3.so
00007f86cd51d000      4K rw--- libfreebl3.so
00007f86cd51e000   1760K r-x-- libc-2.17.so
00007f86cd6d6000   2048K ----- libc-2.17.so
00007f86cd8d6000     16K r---- libc-2.17.so
00007f86cd8da000      8K rw--- libc-2.17.so
00007f86cd8dc000     20K rw---   [ anon ]
00007f86cd8e1000     84K r-x-- libz.so.1.2.7
00007f86cd8f6000   2044K ----- libz.so.1.2.7
00007f86cdaf5000      4K r---- libz.so.1.2.7
00007f86cdaf6000      4K rw--- libz.so.1.2.7
00007f86cdaf7000    384K r-x-- libpcre.so.1.2.0
00007f86cdb57000   2048K ----- libpcre.so.1.2.0
00007f86cdd57000      4K r---- libpcre.so.1.2.0
00007f86cdd58000      4K rw--- libpcre.so.1.2.0
00007f86cdd59000     32K r-x-- libcrypt-2.17.so
00007f86cdd61000   2044K ----- libcrypt-2.17.so
00007f86cdf60000      4K r---- libcrypt-2.17.so
00007f86cdf61000      4K rw--- libcrypt-2.17.so
00007f86cdf62000    184K rw---   [ anon ]
00007f86cdf90000     92K r-x-- libpthread-2.17.so
00007f86cdfa7000   2044K ----- libpthread-2.17.so
00007f86ce1a6000      4K r---- libpthread-2.17.so
00007f86ce1a7000      4K rw--- libpthread-2.17.so
00007f86ce1a8000     16K rw---   [ anon ]
00007f86ce1ac000      8K r-x-- libdl-2.17.so
00007f86ce1ae000   2048K ----- libdl-2.17.so
00007f86ce3ae000      4K r---- libdl-2.17.so
00007f86ce3af000      4K rw--- libdl-2.17.so
00007f86ce3b0000    132K r-x-- ld-2.17.so
00007f86ce581000    220K rw---   [ anon ]
00007f86ce5b8000     20K rw---   [ anon ]
00007f86ce5cf000      4K rw-s- zero (deleted)
00007f86ce5d0000      4K rw---   [ anon ]
00007f86ce5d1000      4K r---- ld-2.17.so
00007f86ce5d2000      4K rw--- ld-2.17.so
00007f86ce5d3000      4K rw---   [ anon ]
00007ffff43c7000    132K rw---   [ stack ]
00007ffff43ee000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total            23040K
[root@localhost opt]# ^C
[root@localhost opt]# 

进程状态

image-20231106181259294

​ 创建状态:进程在创建时需要申请一个空白PCB(process control block 进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行

​ 就绪状态:进程已经准备好,已分配到所需的资源,只要分配到CPU就能够立即运行

​ 执行状态:进程处于就绪状态被调度时,进程进入执行状态

​ 阻塞状态:正在执行的进程由于遇到某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程收到阻塞。在完成请求后进入就绪状态再次等待被调用

终止状态:进程结束,或出现错误,或被系统终止,就会进入终止状态。无法再执行


进程间的转换

​ 运行——>就绪:

​ 1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;

​ 2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态

​ 就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU

​ 运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求

​ 阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列

以下两种状态是不可能发生的:

​ 阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取

​ 就绪 ——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态


进程更多的状态

​ 运行态:running

​ 就绪态:ready

​ 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable

​ 停止态:stopped,暂停于内存,但不会被调度,除非手动启动

​ 僵死态(Z):zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态的子进程


​ 进程结束父进程会回收子进程的硬件资源

​ 子进程如果出现意外关闭, 父进程无感知就不会收回资源,这个人为关闭父进程, 资源不会回收产生僵尸进程

示例:僵尸态

[root@centos8 ~]#bash
[root@centos8 ~]#echo $BASHPID
1809
[root@centos8 ~]#echo $PPID
1436
#将父进程设为停止态
[root@centos8 ~]#kill -19 1436
#杀死子进程后,子进程会进入僵尸态
[root@centos8 ~]#kill -9 1809
[root@centos8 ~]#ps aux #可以看到上面图示的结果,STAT为Z,表示为僵尸态
#方法1:恢复父进程
[root@centos8 ~]#kill -18 1436
#方法2:杀死父进程
[root@centos8 ~]#kill -9 1436
#再次观察,僵尸态的进程不存在了
[root@centos8 ~]#ps aux


进程之间通讯

① 管道文件

② 套接字


同一主机通信

# 管道文件通信,单向传输

# A终端
[root@localhost opt]# mkfifo tmp.fifo
[root@localhost opt]# ls
apps  nginx-1.18.0  nginx-1.18.0.tar.gz  rh  test  tmp.fifo
[root@localhost opt]# echo hello > tmp.fifo   # 将数据写入管道文件												



# 另一个终端 B
[root@localhost opt]# ls
apps  nginx-1.18.0  nginx-1.18.0.tar.gz  rh  test  tmp.fifo
[root@localhost opt]# cat tmp.fifo      # 通过管道文件通信可
hello                             # 以查看内容,但是是单向传递
[root@localhost opt]# 


不同主机通信

套接字文件,双工通信
远程调用 socket=IP加端口号 可以实现不同主机之间的通信

IP     确定网络中主机的位置
端口号  确定应用程序


信号
kill  不能去杀死程序,它是传递给进程一个信号,真正杀死进程的是操作系统

kill  -l  查看信号种类,一共64种

kill -9  强制杀程序


上锁 LOCK

对资源进行上锁,如果资源已经被某进程锁住,则其他进程想修改甚至读取这些数据,都将被阻塞,直到锁被打开

应用场景:银行(多个用户同时对同一个账户进行操作,必须上锁)


进程的优先级

​ 进程的优先级越高,系统越优先处理该进程

优先级种类

​ 系统优先级(tty为"?")

​ 用户优先级


手动改优先级

ps axo pid,comm,ni  
# 查看三列:pid,命令,优先级

[root@localhost opt]# nice -n -10 ping 127.0.0.1
# 修改ping的"NI"优先级为-10,临时性
# NI优先级范围:-20 --- 19


[root@localhost opt]# renice -n -20 2118
# 指定进程的“NI”优先级,临时性


进程类型

操作系统分类

​ 协作式多任务:早期 windows 系统使用,即一个任务得到了 CPU 时间,除非它自己放弃使用CPU ,否则将完全霸占 CPU ,所以任务之间需要协作——使用一段时间的 CPU ,主动放弃使用

​ 抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,操作系统会轮流询问每一个任务是否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务

进程类型

​ 守护进程:daemon,在系统引导过程中启动的进程,和终端无关的进程

​ 前台进程:跟终端有关,通过终端启动的进程

按进程资源使用的分类

​ CPU-Bound:CPU 密集型,非交互

​ O-Bound:IO 密集型,交互


面试题

怎么确定一个程序是多线程还是单线程?

方法1:prtstat pid号   # 查看进程信息

[root@localhost opt]# ps aux | grep nginx
root        704  0.0  0.0  20516   620 ?        Ss   16:05   0:00 nginx: master process /opt/apps/nginx/sbin/nginx
nobody      705  0.0  0.0  23036  1392 ?        S    16:05   0:00 nginx: worker process
root       2211  0.0  0.0 112680   980 pts/0    R+   16:48   0:00 grep --color=auto nginx
[root@localhost opt]# prtstat 704                # 查看nginx程序是否是多线程
Process: nginx         		State: S (sleeping)
  CPU#:  0  		TTY: 0:0	Threads: 1       # Thread为1  表示nginx是单线程
Process, Group and Session IDs
  Process ID: 704		  Parent ID: 1
    Group ID: 704		 Session ID: 704
  T Group ID: -1

Page Faults
  This Process    (minor major):       98         0
  Child Processes (minor major):        0         0
CPU Times
  This Process    (user system guest blkio):   0.00   0.00   0.00   0.00
  Child processes (user system guest):         0.00   0.00   0.00
Memory
  Vsize:       21 MB     
  RSS:         634 kB     		 RSS Limit: 18446744073709 MB
  Code Start:  0x400000  		 Code Stop:  0x49e8ec  
  Stack Start: 0x7ffff43e6d80
  Stack Pointer (ESP): 0x7ffff43e68b8	 Inst Pointer (EIP): 0x7f86cd553536
Scheduling
  Policy: normal
  Nice:   0 		 RT Priority: 0 (non RT)
[root@localhost opt]# 

方法2:查看进程的status的内容 cat /proc/704/status

[root@localhost opt]# ps aux | grep nginx
root        704  0.0  0.0  20516   620 ?        Ss   16:05   0:00 nginx: master process /opt/apps/nginx/sbin/nginx
nobody      705  0.0  0.0  23036  1392 ?        S    16:05   0:00 nginx: worker process
root       2211  0.0  0.0 112680   980 pts/0    R+   16:48   0:00 grep --color=auto nginx
[root@localhost opt]# cat /proc/704/status     # 查看nginx是否为多线程
Name:	nginx								# 在proc中查看nginx的pid号的status内容
Umask:	0000
State:	S (sleeping)
Tgid:	704
Ngid:	0
Pid:	704
PPid:	1
TracerPid:	0
Uid:	0	0	0	0
Gid:	0	0	0	0
FDSize:	64
Groups:	
VmPeak:	   20516 kB
VmSize:	   20516 kB
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	     620 kB
VmRSS:	     620 kB
RssAnon:	     396 kB
RssFile:	     224 kB
RssShmem:	       0 kB
VmData:	     672 kB
VmStk:	     132 kB
VmExe:	     636 kB
VmLib:	    2548 kB
VmPTE:	      56 kB
VmSwap:	       0 kB
Threads:	1
SigQ:	0/7168
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000040001000
SigCgt:	0000000198016a07
CapInh:	0000000000000000
CapPrm:	0000001fffffffff
CapEff:	0000001fffffffff
CapBnd:	0000001fffffffff
CapAmb:	0000000000000000
Seccomp:	0
Cpus_allowed:	ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list:	0-127
Mems_allowed:	00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	1
nonvoluntary_ctxt_switches:	4
[root@localhost opt]# 



[root@localhost opt]# grep -i threads /proc/704/status   # 通过grep过滤出status中的
Threads:	1											#	threads
[root@localhost opt]# 						



1.2 进程管理命令

1. ps

process state

静态查看进程统计信息

选项

支持三种选项

​ UNIX选项,如:-A -e

​ GNU选项,如:--help

​ BSD选项,如:a

a(all)  当前终端下的所有进程信息,也包括其他用户的进程。与“x”结合时,显示系统中所有的进程信息
u(user) 使用以用户为主的格式,输出当前终端下所有的进程信息
x       显示当前用户在所有终端下的进程信息

-e      显示系统内的所有进程信息
-l      使用长(long)格式显示进程信息
-f      使用完整(full)的格式显示进程信息

k|--sort  对属性进行排序,在属性前加“-”表示倒序  ps aux k-%cpu
o         显示多个定制的属性信息



用法

显示当前的静态进程统计信息

ps

[root@localhost ~]# ps           # 直接输入“ps”  默认显示当前终端的静态进程统计信息
   PID TTY          TIME CMD
  2769 pts/0    00:00:00 bash
  2963 pts/0    00:00:00 ps
[root@localhost ~]# 

ps aux

ps aux

[root@localhost ~]# ps aux | head -n 5
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.2 191028  4048 ?        Ss   20:23   0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2  0.0  0.0      0     0 ?        S    20:23   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    20:23   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   20:23   0:00 [kworker/0:0H]
[root@localhost ~]# 





ps -elf

ps axo pid,user | head

ps aux 

占用cpu百分比能不能超过100%?
可以,4核cpu,就有400%

ps aux k -%cpu

# 显示当前终端下所有静态进程的统计信息,并以“%cpu”列倒序排序输出

[root@localhost ~]# ps aux k -%cpu | head -n 5
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        706  0.1  0.3 305316  6324 ?        Ssl  20:23   0:10 /usr/bin/vmtoolsd
gdm        1522  0.1  6.2 1928252 116620 ?      Sl   20:23   0:08 /usr/bin/gnome-shell
root          1  0.0  0.2 191028  4048 ?        Ss   20:23   0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2  0.0  0.0      0     0 ?        S    20:23   0:00 [kthreadd]
[root@localhost ~]# 

ps o 指定显示哪些列的静态进程统计信息

ps axo user,pid,com | head -n 5


[root@localhost ~]# ps axo user,pid,comm | head -n 5
USER        PID COMMAND
root          1 systemd
root          2 kthreadd
root          3 ksoftirqd/0
root          5 kworker/0:0H
[root@localhost ~]# 

ps -elf

[root@localhost ~]# ps -elf | head -n 5
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 - 47757 ep_pol 20:23 ?        00:00:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root          2      0  0  80   0 -     0 kthrea 20:23 ?        00:00:00 [kthreadd]
1 S root          3      2  0  80   0 -     0 smpboo 20:23 ?        00:00:00 [ksoftirqd/0]
1 S root          5      2  0  60 -20 -     0 worker 20:23 ?        00:00:00 [kworker/0:0H]
[root@localhost ~]# 

优先级:PRI 和 NI 的关系如下:

PRI (最终值) = PRI (原始值) + NI  # 系统他会自动计算最终值,我们看到时,它已经计算好了,所以我们直接比较PRI值
ps axo pid,cmd,ni
#查看


[root@centos8 ~]#nice -n -10 ping 127.0.0.1
[root@centos7 ~]#renice -n -20 2118

其实,大家只需要记得,我们修改 NI 的值就可以改变进程的优先级即可。NI 值越小,进程的 PRI 就会降低,该进程就越优先被 CPU 处理;反之,NI 值越大,进程的 PRI 值就会増加,该进程就越靠后被 CPU 处理。

修改 NI 值时有几个注意事项:

  • NI 范围是 -20~1
  • 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程
  • 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0
  • 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程
面试题:找到未知进程的执行程序文件路径(找未知文件的文件路径)
# 怎么通过该进程找到其文件路径

[root@localhost ~]# ps aux |tail -n 5
root       3436  4.7  0.0 107948   612 pts/1    T    22:18   0:02 dd if=/dev/zero of=/dev/tmp
root       3437 97.7  0.0 107948   612 pts/1    R+   22:18   0:43 dd if=/dev/zero of=/dev/null
root       3451  0.0  0.0 107904   612 ?        S    22:19   0:00 sleep 60
root       3456  0.0  0.0 151064  1816 pts/0    R+   22:19   0:00 ps aux
root       3457  0.0  0.0 108156   676 pts/0    S+   22:19   0:00 tail -n 5
[root@localhost ~]# 


# 第二行进程的cpu占用率达到97%,我想要查找该进程的文件位置,具体操作如下

[root@localhost ~]# cd /proc/3437    
# 进入到该pid下找到exe文件,ll显示该进程的软连接
[root@localhost 3437]# ls
attr        coredump_filter  gid_map    mountinfo   oom_score      schedstat  status
autogroup   cpuset           io         mounts      oom_score_adj  sessionid  syscall
auxv        cwd              limits     mountstats  pagemap        setgroups  task
cgroup      environ          loginuid   net         personality    smaps      timers
clear_refs  exe              map_files  ns          projid_map     stack      uid_map
cmdline     fd               maps       numa_maps   root           stat       wchan
comm        fdinfo           mem        oom_adj     sched          statm
[root@localhost 3437]# ll exe
lrwxrwxrwx 1 root root 0 11月  6 22:22 exe -> /usr/bin/dd
[root@localhost 3437]# 

运维故障案例中:病毒,怎么解决?
找到含有病毒的文件
把该病毒文件删除
并且在该目录下创建同名的文件,防止病毒创建病毒文件
然后给该文件创建一个权限  “chattr +i 该文件名”(输入该命令后,连超级管理员都删除不了,只有“chattr -i 该文件名”)

2. top

linux的任务管理器

动态查看进程信息,不包括查看磁盘、网络信息,按“q”退出

选项
-d 秒数   指定 top 命令每隔几秒更新。默认是 3 秒

-b       使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中

-n 次数   指定 top 命令执行的次数。一般和"-"选项合用

-p pid号  仅查看指定 ID 的进程

-s        使 top 命令在安全模式中运行,避免在交互模式中出现错误

-u 用户名  只监听某个用户的进程
用法

top

# 直接输入“top”,因为


[root@localhost 3437]# top -d 10                # linux的任务管理器,默认每隔3秒更新一次信息,-d 改变更新间隔时间
top - 22:29:47 up  2:06,  2 users,  load average: 0.99, 0.84, 0.50
Tasks: 162 total,   2 running, 159 sleeping,   1 stopped,   0 zombie
%Cpu(s): 14.3 us, 14.3 sy,  0.0 ni, 71.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867048 total,   902600 free,   262652 used,   701796 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1079184 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND             
  3437 root      20   0  107948    612    516 R 100.0  0.0  11:01.95 dd                  
     1 root      20   0  191028   4048   2504 S   0.0  0.2   0:00.93 systemd             
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd            
     3 root      20   0       0      0      0 S   0.0  0.0   0:00.09 ksoftirqd/0         
     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H        
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.16 kworker/u256:0      
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.15 migration/0         
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh              
     9 root      20   0       0      0      0 S   0.0  0.0   0:02.62 rcu_sched           
    10 root      rt   0       0      0      0 S   0.0  0.0   0:00.11 watchdog/0          
    11 root      rt   0       0      0      0 S   0.0  0.0   0:00.06 watchdog/1          
    12 root      rt   0       0      0      0 S   0.0  0.0   0:00.11 migration/1         
    13 root      20   0       0      0      0 S   0.0  0.0   0:00.24 ksoftirqd/1         
    15 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/1:0H        
    17 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kdevtmpfs           
    18 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 netns               
    19 root      20   0       0      0      0 S   0.0  0.0   0:00.00 khungtaskd          
    20 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 writeback           
    21 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kintegrityd         
    22 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 bioset    

3. htop

需要yum安装,增强版的top

4. pgrep

查看指定的进程

选项

-U      指定用户
-l      显示进程名
-a      显示完整格式的进程名
-P pid  显示指定进程的子进程

用法

pgrep -l

pgrep -l "log"

5. pidof

只知道进程名字不知道pid号

用法

pidof 进程名

pidof nginx

6. pstree

以树形结构显示出进程信息

选项

-p  显示进程树,并显示进程号

五大性能

cpu:ps aux、ps -elf、top、vmstat

内存:top、free、vmstat

磁盘大小:lsblk、剩余量df

磁盘读写:dd、iostat、vmstat

网络

7. lsof

lsof命令,”list open files“,列出系统中已经打开的文件

删除文件磁盘空间不释放,怎么解决?

lsof | grep delete   # 查找已经删除的文件(该文件可以是正在打开)

kill -9 pid号    # kill -9 强制删除该进程,使得这部分的磁盘空间得到释放

df -h            # 查看磁盘空间是已经被释放了,但是因为该进程被强制删除了,所有正在用该文件的用户都会被强制退出




echo " " > bigfile  # 用一个空格去覆盖写入到该文件中

恢复已删除的文件

当其他用户在用该文件时,我们把该文件删除,请问该文件怎么恢复?
思路:因为其他用户正在用,所以该文件还在内存中,但是磁盘中的该文件被我们删除了,所以我们通过在内存中找到该文件,然后恢复该文件

lsof | grep test
cd /proc/9701
ll fd   (fd文件夹下有一个软连接,指向该文件在磁盘中的位置)
cat 该软连接的文件(可以查看到该文件的内容,可能是部分内容,也有可能有乱码)

8. vmstat

监控系统资源,动态,虚拟,资源

9. free

free -h
free -m  # 以“M”为单位查看
#清缓存
echo 3 > /proc/sys/vm/drop_caches

10. iostat

查看磁盘的读写性能

iostat 1 -d /dev/sda  # 每一秒更新sda硬盘的读写信息

11. iotop

查看磁盘信息,动态

系统不自带,需要安装

12. iftop

查看网络信息

系统不自带,需要安装,在epel源中

iftop -i ens33

查看指定网卡信息

13. dstat

可以查看五大性能的信息,万能

进程的启动方式

手工启动

​ 前台启动

​ 后台启动

将前台任务放到后台运行
dd if=/dev/zero of=/dev/null  &


查看后台运行的命令
jobs


把后台命令调回前台
fg1


把前台任务再调回后台
"ctrl+z"  调回后台,并停止


把后台停止的任务运行
bg1

为什么这么关注进程?

进程会消耗cpu、内存等系统资源,系统调优

2. 计划任务

2.1 一次性计划任务

at命令

at 时间HH:MM(在下一行输入任务)

at 13:44
at> reboot


2.2 crontab命令

crontab

*(星号)代表任何时间。比如第一个"*"就代表一小时中每分钟都执行一次的意思

,(逗号)代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令

-(中杠)代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令

/(正斜线)代表每隔多久执行一次。比如"*/10****命令",代表每隔 10 分钟就执行一次命令。

crontab -e

编辑一个定时任务

*****  执行操作(命令,写绝对路径)
分时日月周

分  0-59
时  0-23
日  1-31
月  1-12
周  0-6(0或7都表示星期天)

用法

*/2 * * * *  /usr/bin/cp /etc/passwd /opt/soft

注意事项

执行命令最好使用绝对路径

五大性能使用的命令

cpu      ps aux、ps -elf、top、htop、  vmstat、dstat

内存      top、htop、free -h、          vmstat、dstat

磁盘大小   lsblk、df -h

磁盘读写   dd、iostat、iotop、           vmstat、dstat

网络      iftop、                      vmstat、dstat