保存在硬盘、光盘等介质中的可执行代码和数据
执行特定任务的一串代码
进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体
进程是程序的副本,进程是有生命周期(运行状态,关闭状态)
进程一般由程序、数据集合和进程控制块三部分组成
每开启一个进程会消耗相应的硬件资源(如:内存,cpu,磁盘读写)
内存不足时,关闭没有用的进程(跟开发沟通)
硬件资源不足时,对进程进行清理
查看进程中的线程
如何确定一个程序是多线程还是单线程?
grep -i threads /proc/进程的PID/status #查看程序的线程
prtstat 进程pid号|grep -i threads #查看程序的线程
系统中可以识别的信号较多,我们可以使用命令"kill -l"或"man 7 signal"来查询
号代号 | 信号名称 | 说 明 |
---|---|---|
1 | SIGHUP | 该信号让进程立即关闭.然后重新读取配置文件之后重启 |
2 | SIGINT | 程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键 |
3 | SIGQUIT | 退出 |
8 | SIGFPE | 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误 |
9 | SIGKILL | 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。一般用于强制中止进程 |
14 | SIGALRM | 时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号 |
15 | SIGTERM | 正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9 |
18 | SIGCONT | 该信号可以让暂停的进程恢复执行。本信号不能被阻断 |
19 | SIGSTOP | 该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断 |
Linux系统各进程的相关信息均保存在/proc/数字 目录/status 下的文件中
ps aux #可以查看系统中所有的进程
ps -le #可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
ps -l #只能看到当前 Shell 产生的进程
ps axo pid,cmd,%mem,%cpu #查看进程的特定属性
ps aux k -%cpu #按CPU利用率倒序排序
dd if=/dev/zero of=/dev/null #模拟cpu忙
a∶ 显示终端上的所有进程,包括其它用户的进程。与“x”选项结合时将示系统中所有的进程信息
u∶ 使用以用户为主的格式输出进程信息
x∶ 显示当前用户在所有终端下的进程信息
-e:显示系统内的所有进程信息。
-l:使用长(Long)格式显示进程信息。
-f:使用完整的(Full)格式显示进程信
k|--sort: 属性 对属性排序,属性前加 - 表示倒序 ps aux k -%cpu
o:属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
各列的解释
僵尸进程
一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
僵尸进程命令过程
[root@localhost ~]# bash
[root@localhost ~]# echo $BASHPID
60403 #子进程
[root@localhost ~]# echo $PPID
57486 #父进程
[root@localhost ~]# kill -19 57486 #将父进程设为停止状态
[root@localhost ~]# kill -9 60403 #杀死子进程,使其进入僵尸态
已杀死
[root@localhost ~]# ps aux #查看静态进程信息(60403 STAT为Z,表示为僵尸态)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 193700 4804 ? Ss 00:32 0:02 /usr/lib/systemd/systemd --switche
root 2 0.0 0.0 0 0 ? S 00:32 0:00 [kthreadd]
root 57486 0.0 0.1 116048 2780 pts/1 Ts 08:26 0:00 -bash
root 60403 0.0 0.0 0 0 pts/1 Z+ 13:39 0:00 [bash] <defunct>
[root@localhost ~]# kill -18 57486 #方法1:恢复父进程
[root@localhost ~]# kill -9 1436 #方法2:杀死父进程
[root@localhost ~]# ps aux #查看静态进程信息(僵尸态的进程不存在了)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 193700 4804 ? Ss 00:32 0:02 /usr/lib/systemd/systemd --switche
root 2 0.0 0.0 0 0 ? S 00:32 0:00 [kthreadd]
root 57486 0.0 0.1 116128 2796 pts/1 Ss+ 08:26 0:00 -bash
僵尸进程命令(图文详解)
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head #排序,查找占用最多内存的进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head #排序,查找占用最多CPU的进程
ps axo pid,cmd,%cpu,%mem --sort %mem #按内存倒序排序
ps -aT #显示所有线程
-a:显示所有进程的pid
-T:查看线程信息
各列的解释
F∶内核分配给进程的系统标记(常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限)
S∶进程的状态
UID∶启动这些进程的用户ID
PID∶进程的ID
PPID∶父进程的ID(如果该进程是由另一个进程启动的)
C∶ 进程生命周期中的CPU利用率
PRI∶进程的优先级 (数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改)
NI∶ 进程的优先级,数值越小,该进程越早被执行;可以人为修改
修改 NI 的值就可以改变进程的优先级。NI 值越小,进程的 PRI 就会降低,该进程就越优先被 CPU 处理;反之,NI 值越大,进程的 PRI 值就会増加,该进程就越靠后被 CPU 处理。
修改 NI 值时有几个注意事项:
ADDR∶进程的内存地址
Sz∶该进程占用多大内存
WCHAN∶该进程是否运行。"-"代表正在运行
STIME∶ 进程启动时的系统时间
TTY∶ 进程启动时的终端设备
TIME∶ 该进程占用 CPU 的运算时间,注意不是系统时间
CMD∶ 进程的启动命令
prtstat 1112 #查看1112进程信息
top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。命令的输出主要分为两部分:
在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:
第一行:任务队列信息
第二行:进程信息
第三行:CPU的信息
第四行:内存的信息
total—总内存空间
free—空闲内存
used—己用内存
buff/cache—物理内存和交换内存的缓冲区总和(读写缓存)
缓冲(buffer)和缓存(cache)的区别:
简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。
第五行:交换分区的信息
-U:指定用户
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程
pidof nginx #查看nginx进程的pid号(已知程序名,不知道pid号)
格式:pstree -aup
常用选项:
-a 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高亮显示指定进程及其前辈进程
pstree -ap 用户名 只查看属于指定用户的进程树结构
格式:lsof [选项]
选项 | 功能 |
---|---|
-c 字符串 | 只列出以字符串开头的进程打开的文件 |
+d 目录名 | 列出某个目录中所有被进程调用的文件 |
-u 用户名 | 只列出某个用户的进程打开的文件 |
-p pid | 列出某个 PID 进程打开的文件 |
free -h #查看内存使用情况
free -m #以m为单位查看内存使用情况
echo 3 > /proc/sys/vm/drop_caches #清除缓存
pmap 1073 #查看进程占用内存的详细信息
常用选项:
-c 只显示CPU行
-d 显示设备〈磁盘)使用状态
-k 以千字节为为单位显示输出
-t 在输出中包括时间戳
-x 在输出中包括扩展的磁盘指标
iotop #监视磁盘I/O
iftop -ni ens33 #网络流量
uptime #系统运行了多久时间
mpstat #显示CPU相关统计
dstat #系统资源统计
前台启动:用户输入命令,直接执行程序
后台启动:在命令行尾加入“&”符号,输出信息中包括后台任务序号、PID号
使用at命令,设置一次性计划任务
使用crontab命令,设置周期性计划任务
“命令后跟&”,把命令放入后台执行
Ctrl+Z组合键:将当前的进程挂起,即调入后台并停止执行
查看后台任务列表 jobs
jobs -l :查看处于后台的任务列表
调出后台任务 fg
将后台的进程恢复到前台运行,可指定任务序号,不指定任务序号表示所有后台任务全部恢复至前
并行执行任务,命令之间用“&”连接
如:ping 127.0.0.1&ping 127.0.0.2&ping 127.0.0.3&
信号编号 | 信号名 | 含义 |
---|---|---|
0 | EXIT | 程序退出时收到该信息 |
1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化 |
2 | INT | 表示结束进程,但并不是强制性的,常用的 “Ctrl+C” 组合键发出就是一个 kill -2 的信号 |
3 | QUIT | 退出 |
9 | KILL | 杀死进程,即强制结束进程 |
11 | SEGV | 段错误 |
15 | TERM | 正常结束进程,是 kill 命令的默认信号 |
killall [选项] [信号] 进程名
killall -i sshd #交互杀死 sshd
kill用于终于指定PID号的进程
killall用于终止指定名称相关的所有进程
-9选项用于强制终止
pkill [信号] 进程名
-U:根据进程所属的用户名终止相应进程
-t:根据进程所在的终端终止相应程序
第一步:at [HH:MM] [yyyy-mm-dd] 不携带日期表示为当天
第二步:输入指定命令
第三步:Ctrl+D提交任务
删除指定未执行任务
格式:atrm 任务序号
全局配置文件,位于文件:/etc/crontab
系统默认的设置,位于目录:/etc/cron.*/
用户定义的设置,位于文件:/var/spool/cron/用户名
选项 | 功能 |
---|---|
-u user | 用来设定某个用户的 crontab 服务,例如 “-u demo” 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行 |
-e | 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件 |
-l | 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容 |
-r | 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件 |
-i | 在删除用户的 crontab 文件时,给确认提示 |
时间周期设置:分钟 小时 日期 月份 星期
任务内容设置:命令或者脚本文件
项目 | 含义 | 范围 |
---|---|---|
第一个"*" | 一小时当中的第几分钟(minute) | 0~59 |
第二个"*" | 一天当中的第几小时(hour) | 0~23 |
第三个"*" | 一个月当中的第几天(day) | 1~31 |
第四个"*" | 一年当中的第几个月(month) | 1~12 |
第五个"*" | 一周当中的星期几(week) | 0~7(0和7都代表星期日) |
特殊符号 | 含义 |
---|---|
*(星号) | 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思 |
,(逗号) | 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令 |
-(中杠) | 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令 |
/(正斜线) | 代表每隔多久执行一次。比如"/10***命令",代表每隔 10 分钟就执行一次命令 |
crontab -e [-u root] 编辑 一个计划任务
每分钟定时执行一次规则
每一分钟执行:*/1 * * * *或者 * * * * *
每五分钟执行: */5 * * * *
每小时定时执行一次规则
每小时执行:0 * * * * 或者 0 */1 * * *
每天上午七点执行:0 7 * * * *
每天上午七点十分执行: 10 7 * * *
每天定时执行一次规则
每天执行:0 0 * * *
每周定时执行一次规则
每周执行:0 0 * * 1
每月定时执行一次规则
每月执行: 0 0 1 * *
每年定时执行一次规则
每年执行: 0 0 1 1 *
30 1 * * * /usr/bin/cp -a /var/log/messages /root/log-$(date +%Y%m%d) 每天1点半将系统日志复制到root目录下并重命名为log加日期标注
常用日期表达命令
? date +%F显示格式为YYYY-MM-DD
? date +%Y%m%d显示格式为YYYYMMDD
echo ‘30 1 * * * /usr/bin/cp -a /var/log/messages /root/log-$(date +%Y%m%d)’ >> /var/spool/cron/root
此方法需指定执行任务的用户,且无法通过crontab命令进行查看、编辑以及删除,如需操作需进入/etc/crontab,编辑格式如下:
30 1 * * * root /usr/bin/cp -a /var/log/messages /root/log-$(date +%Y%m%d)