这里写目录标题
进程和计划任务
一.进程
1.进程是什么
进程是程序载入内存中的副本,是资源调度的单位
每一个进程都有一个PID号
进程通常从执行进程的用户继承
进程存在生命周期
进程都有父进程
进程的创建:
init:第一个进程
systemd:centos7中第一个进程,是所有进程的父进程
2.进程的特性
进程具有
动态性:进程是程序执行过程,有生命周期,可以存在,可以消失
并发性:同一个程序中可以有多个进程同时执行
独立性:进程是系统资源分配的一个独立单位
结构性:进程由程序,数据,进程控制块组成
pstree命令可以看到程序是单线程还是多线程
-p选项可以显示PID号
[root@localhost ~]#pstree -p
systemd(1)─┬─ModemManager(861)─┬─{ModemManager}(879)
│ └─{ModemManager}(902)
├─NetworkManager(957)─┬─{NetworkManager}(965)
│ └─{NetworkManager}(969)
├─VGAuthService(851)
├─abrt-dbus(17045)─┬─{abrt-dbus}(17046)
│ ├─{abrt-dbus}(17047)
│ └─{abrt-dbus}(17048)
.............
prtstat PID号可以看到进程的详情
[root@localhost ~]#prtstat 635
Process: systemd-udevd State: S (sleeping)
CPU#: 1 TTY: 0:0 Threads: 1
Process, Group and Session IDs
Process ID: 635 Parent ID: 1
Group ID: 635 Session ID: 635
T Group ID: -1
Page Faults
This Process (minor major): 3570 14
Child Processes (minor major): 59090 210
CPU Times
This Process (user system guest blkio): 0.08 0.48 0.00 0.01
Child processes (user system guest): 1.37 7.14 0.00
Memory
Vsize: 48 MB
RSS: 1269 kB RSS Limit: 18446744073709 MB
Code Start: 0x5571e6ac9000 Code Stop: 0x5571e6b13390
Stack Start: 0x7ffc3fe5a080
Stack Pointer (ESP): 0x7ffc3fe59938 Inst Pointer (EIP): 0x7fbfb34c8903
Scheduling
Policy: normal
Nice: 0 RT Priority: 0 (non RT)
//Threads:1表示为单线程
3.进程与内存
内存泄漏:Memory Leak
指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态
内存溢出:Memory Overflow
指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出,类似红杏出墙
内存不足:OOM
java程序会先启动JVM虚拟机,再在虚拟机上运行程序,所以会占用很多内存
4.进程状态
创建状态
进程在创建时系统会给进程调度资源,如果无法满足,那么进程就进入创建状态
就绪状态
进程准备完毕,资源条件满足,准备分配到cpu运行
执行状态
就绪状态之后的状态,进入cpu进行执行
阻塞状态
执行中的进程无法运行,进入阻塞。必须等到I/O请求,申请缓存区的请求满足后才能进入就绪状态
终止状态
进程结束,或者错误,被系统终止,无法再执行
5.进程通讯
同一主机:通过pipe管道(单向)或者socket套接字(双向)
不同主机:需要ip地址和端口号
6.进程优先级
一般进程的优先级都是默认的,可以通过设置进程NI(-20~19)来设置进程优先级,优先级=PRI+NI,数值越低,优先级越高
7.进程分类
操作系统分类:
协作式多任务:早期的windows系统使用,一个任务会霸占一整个cpu,效率十分低
抢占式多任务:linux内核,cpu会轮流处理任务,一定时间后会剥夺任务使用权,执行下一个任务,由此循环
进程类型:
守护进程:daemon,在系统引导过程中启动的进程,和终端无关
前台进程:和终端相关,通过终端启动的进程
二.进程管理
1.kill
kill -s 信号名称 PID
kill -信号代号 PID
可以使用命令"kill -l"或"man 7 signal"来查询
信号代号 | 信号名称 | 说明 |
---|---|---|
1 | SIGHUP | 让进程立即关闭.然后重新读取配置文件之后重启 |
2 | SIGINT | 程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键 |
3 | SIGQUIT | 退出 |
8 | SIGFPE | 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误 |
9 | SIGKILL | 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。一般用于强制中止进程,如果程序在传输数据,可能导致数据丢失 |
15 | SIGTERM | 正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9 |
19 | SIGSTOP | 该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断 |
2.查看进程信息
ps
静态查看进程信息,linux系统中进程的相关信息保存在/proc/进程PID/status下文件中
ps支持三种选项格式
UNIX选项:-A -e等
GNU选项:–help
BSD选项:a
//ps aux可以查看系统中所有的进程
[root@localhost ~]#ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 194504 4940 ? Ss 06:05 0:02 /usr/lib/systemd/syste
root 2 0.0 0.0 0 0 ? S 06:05 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 06:05 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 06:05 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 06:05 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 06:05 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 06:05 0:02 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 06:05 0:00 [watchdog/0]
root 11 0.0 0.0 0 0 ? S 06:05 0:00 [watchdog/1]
....
//ps -le还能看到父进程的PID和优先级
[root@localhost ~]#ps -le
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 48626 ep_pol ? 00:00:02 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0
1 S 0 5 2 0 60 -20 - 0 worker ? 00:00:00 kworker/0:0H
1 S 0 7 2 0 -40 - - 0 smpboo ? 00:00:00 migration/0
1 S 0 8 2 0 80 0 - 0 rcu_gp ? 00:00:00 rcu_bh
1 S 0 9 2 0 80 0 - 0 rcu_gp ? 00:00:02 rcu_sched
5 S 0 10 2 0 -40 - - 0 smpboo ? 00:00:00 watchdog/0
...........
//ps -l只能看到当前shell产生的进程
[root@localhost ~]#ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 17026 17022 0 80 0 - 29144 do_wai pts/2 00:00:00 bash
0 R 0 18506 17026 0 80 0 - 37235 - pts/2 00:00:00 ps
选项 | 说明 |
---|---|
a | 显示当前终端下的所有进程信息,包括其他用户的进程 |
u | 使用以用户为主的格式输出进程信息。 |
x | 显示当前用户在所有终端下的进程信息。 |
-e | 显示系统内的所有进程信息。 |
-l | 使用长(Long)格式显示进程信息。 |
-f | 使用完整的(Full)格式显示进程信 |
k | 对属性排序,属性前加 - 表示倒序 ps aux k -%cpu |
STAT:进程状态
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台进程
l: 多线程进程
L:内存分页并带锁
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
I:Idle kernel thread,CentOS 8 新特性
ni: nice值
pri: priority 优先级
相加得到实际优先级,可手动设置ni
查看进程信息 prtstat
[root@localhost ~]#prtstat 18495
Process: kworker/9:2 State: S (sleeping)
CPU#: 9 TTY: 0:0 Threads: 1
Process, Group and Session IDs
Process ID: 18495 Parent ID: 2
Group ID: 0 Session ID: 0
T Group ID: -1
Page Faults
This Process (minor major): 0 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: 0 B
RSS: 0 B RSS Limit: 18446744073709 MB
Code Start: 0 Code Stop: 0
Stack Start: 0
Stack Pointer (ESP): 0 Inst Pointer (EIP): 0
Scheduling
Policy: normal
Nice: 0 RT Priority: 0 (non RT)
top
实时显示进程信息
选项 | 说明 |
---|---|
-d | 指定 top 命令每隔几秒更新 |
-b | 使用批处理模式输出 |
-n | 次数 |
-p | 仅查看指定 ID 的进程 |
-s | 使 top 命令在安全模式中运行,避免在交互模式中出现错误 |
-u | 只监听某个用户的进程 |
在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:
? 或 h:显示交互模式的帮助;
c:按照 CPU 的使用率排序,默认就是此选项;
M:按照内存的使用率排序;
N:按照 PID 排序;
T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
r:按照 PID 给某个进程重设优先级(Nice)值;
q:退出 top 命令;
[root@localhost ~]#top
top - 19:16:22 up 13:10, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 278 total, 1 running, 277 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867048 total, 177888 free, 789304 used, 899856 buff/cache
KiB Swap: 4194300 total, 4175808 free, 18492 used. 822852 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18802 root 20 0 157848 2376 1544 R 0.3 0.1 0:00.06 top
1 root 20 0 194504 4940 2828 S 0.0 0.3 0:02.85 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.69 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.03 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.07 rcu_sched
..........
top首部信息显示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分别显示:1 (数字)
memory信息:m命令
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W
htop同样可以查看,但是需要安装
pidof
当已知程序名不知道pid号
[root@localhost ~]#pidof systemd
1
//可以根据进程名查看PID
pstree
可以树形查看进程信息
-a 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
-p 显示PID
-u 显示用户切换
lsof
列举系统中已经被打开的文件
选项 | 功能 |
---|---|
-c | 只列出以字符串开头的进程打开的文件。 |
+d | 列出某个目录中所有被进程调用的文件。 |
-u | 只列出某个用户的进程打开的文件。 |
-p | 列出某个 PID 进程打开的文件。 |
3.监控系统资源 虚拟资源
vmstat
监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。
[root@localhost ~]#vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 18488 175456 40 902732 0 0 3 2 9 8 0 0 100 0 0
选项 | 说明 |
---|---|
-fs | -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明 |
-S | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
-d | 列出硬盘有关读写总量的统计表。 |
-p | 查看硬盘分区的读写情况。 |
4.内存
free -m 以m为单位查看
free -h
pmap 1073
查看进程占用 内存的详细信息
[root@localhost ~]#free -h
total used free shared buff/cache available
Mem: 1.8G 769M 171M 3.7M 881M 803M
Swap: 4.0G 18M 4.0G
5.iostat
iostat 可以提供更丰富的IO性能状态数据
[root@localhost ~]#iostat
Linux 3.10.0-693.el7.x86_64 (localhost.localdomain) 2023年07月27日 _x86_64_ (16 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.01 0.01 0.01 0.00 0.00 99.97
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.05 52.47 31.68 2535708 1531027
scd0 0.00 0.02 0.00 1050 0
dm-0 1.04 51.67 31.24 2497179 1509539
dm-1 0.12 0.13 0.40 6288 19380
-c 只显示CPU行
-d 显示设备〈磁盘)使用状态
-k 以千字节为为单位显示输出
-t 在输出中包括时间戳
-x 在输出中包括扩展的磁盘指标
三.命令的前后台执行
前台启动:通过终端启动,且启动后一直占据终端
后台启动:可通过终端启动,但启动后即转入后台运行(释放终端)
1.置于后台执行
运行中的作业: Ctrl+z 放到后台 但是会停止作业
尚未启动的作业: COMMAND &
[root@localhost /]#dd if=/dev/zero of=/dev/null &
[1] 11255
[root@localhost /]#jobs //可查看后台运行的程序
[1]+ 运行中 dd if=/dev/zero of=/dev/null &
[root@localhost /]#fg 1 //查看后台的命令1
dd if=/dev/zero of=/dev/null
^Z //ctrl+z停止
[1]+ 已停止 dd if=/dev/zero of=/dev/null
[root@localhost /]#dd if=/dev/zero of=/dev/null &
[3] 11418
[root@localhost /]#kill %3
[root@localhost /]#fg
-bash: fg: 任务已经终止
[2]- 已终止 dd if=/dev/zero of=/dev/null
[3]+ 已终止 dd if=/dev/zero of=/dev/null
// kill %+序号 也可以停止
//或者killall 进程名也可以,但是很不安全稳定
四.计划任务
1.at一次性任务
需要安装atd软件包
at任务队列存放于/var/spool/at目录下
执行任务时的PATH变量与当前定义任务的用户一致
at [option] TIME
at [选项] [yyyy-mm-dd]
[root@localhost /]#at 12:20 2023-07-28
at> touch /opt/woshidanb.txt<EOT>
job 1 at Fri Jul 28 12:20:00 2023
//在2023-07-28的12:20创建文件
[root@localhost /]#atq
1 Fri Jul 28 12:20:00 2023 a root
//atq可以查看计划的任务
2.crontab
crontab [选项] [file]
选项 | 说明 |
---|---|
-u | 指定某个用户的crontab服务 |
-e | 编辑用户的crontab用户内容,设置任务 |
-l | 显示用户的crontab的文件内容 |
-r | 从/var/spool/cron删除用户的crontab文件 |
-i | 删除用户的crontab文件 |
crontab -e进入编辑界面
* * * * * command
* | 含义 | 范围 |
---|---|---|
第一个 | minute | 0-59 |
第二个 | hour | 0-23 |
第三个 | day | 1-31 |
第四个 | month | 1-12 |
第五个 | week | 0-7(0,7都代表周日) |
*表示任何时间
,不连续的时间
-范围
/表示每隔多长时间执行一次
[root@localhost opt]#crontab -e
*/1 * * * * cp /etc/passwd /opt
//每一分钟就把passwd复制到opt下
[root@localhost opt]#ls
passwd
注意事项:
6 个选项都不能为空
在定义时间时,日期和星期最好不要在一条定时任务中出现
在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径