进程:指的是我们执行程序时,我们程序运行的一个顺序,因为我们的系统每次之运行一个程序
- 查看进程
进程定义:正在执行的程序,会占用cpu和内存资源
- ps 静态显示进程信息
常用格式:
ps ax #显示所有进程
这个命令会列出系统中所有进程的相关信息,包括进程的 ID(PID)、终端(TTY)、状态(STAT)、运行时间(TIME)以及命令(COMMAND)等信息
在使用 ps ax 命令查看进程列表后,TTY中可能出现的常见显示包括:
- tty:表示进程与控制台连接,通常是通过物理终端或虚拟终端(如 SSH 连接)进行交互
- ?:表示进程没有与任何终端设备相关联,通常是守护进程或后台进程
- pts/0、pts/1、pts/N:表示进程与虚拟终端(pseudo-terminal)相关联,通常是通过 SSH 或其他远程登录方式进行交互
- ttyN:表示进程与物理终端设备相关联,其中 N 为终端设备的编号,如 tty1、tty2 等
在使用 ps ax 命令查看进程列表后,STAT 中可能出现的常见显示包括:
- R:表示进程正在运行或者在运行队列中等待。
- S:表示进程正在睡眠中,即在等待某个事件的发生。
- D:表示进程正在执行不可中断的睡眠状态,通常是在等待硬件设备响应。
- Z:表示僵尸进程,即进程已经终止,但是父进程还未对其进行善后处理。
- T:表示进程被暂停或停止了。
- W:表示进程正在等待系统资源分页。
- X:表示进程已经退出。
- K:表示进程被杀死(killed)。
- P:表示进程等待交换页。
- I:表示进程是空闲的。
- N:只是表示低优先级,而不是进程的实际状态
ps axuf #显示所有进程,并列出执行进程用户,以及进程间父子关系
这条命令用于显示详细的进程信息,包括用户(USER)、进程 ID(PID)、CPU 占用率(%CPU)、内存占用率(%MEM)、虚拟内存大小(VSZ)、实际内存大小(RSS)、终端(TTY)、进程状态(STAT)、启动时间(START TIME)、累计 CPU 时间(TIME)和命令(COMMAND)等
ps elf #同ps axuf
显示内容包括字段 F(标志), UID(用户ID), PID(进程ID), PPID(父进程ID), PRI(优先级), NI(进程的nice值), VSZ(虚拟内存大小), RSS(常驻集大小), WCHAN(进程睡眠时所在的内核函数), STAT(进程状态), TTY(终端设备), TIME(累计CPU时间), COMMAND(命令)等
在使用 ps -elf 命令时,STAT 列显示的是进程的状态,常见的几种显示方式及其代表的意思包括:
- R:表示进程正在运行,或者处于可运行状态,也就是说进程当前正在 CPU 上执行
- S:表示进程处于休眠状态,通常是因为等待某个事件的发生,例如等待 I/O 完成或者等待信号。
- D:表示进程不可中断的休眠状态,通常是在等待硬件 I/O 操作完成,这种状态下进程不会响应信号。
- T:表示进程被跟踪或停止了,通常是由调试器设置的状态。
- Z:表示僵尸进程,即进程已经结束,但是父进程还没有对其进行善后处理,它占用系统资源但不再执行任何代码。
- <:表示进程的优先级值被降低。
- N:表示进程的优先级值被提高。
- +:表示该进程处于可中断睡眠状态,即进程可能会因为某些事件(如信号)的发生而被唤醒。
- s:表示该进程是会话领导者(session leader),通常是会话中第一个启动的进程,它负责创建并管理会话中的其他进程
- l:表示该进程是多线程进程(multithreaded process),即进程包含多个线程。
PS axuf与ps elf区别:
ps axuf 能够以树状结构显示进程之间的关系,而 ps elf 则更注重以列表形式显示进程的详细信息。具体选择哪种命令取决于你需要查看的进程信息的深度和方式
- top 动态显示进程信息
按M,以内存占用情况排名
按P,以cpu占用情况排名,默认显示
按q退出显示
PID:进程ID
USER:运行该进程的用户
PR:进程的优先级
NI:进程的nice值
VIRT:进程使用的虚拟内存量
RES:进程使用的物理内存量(常驻集大小)
SHR:进程使用的共享内存量
S:进程状态
%CPU:进程占用CPU的使用率
%MEM:进程占用内存的使用率
TIME+:进程累计CPU时间
COMMAND:进程的命令名称
- pgrep 按条件显示进程信息
pgrep httpd #只显示进程号
pgrep -l httpd #显示进程名及进程号
- pstree树形结构显示进程父子关系
例:
- 启动进程
- 手工启动
前台启动: 命令
后台启动: 命令 &
jobs 显示后台任务
示例命令:cat /dev/zero > /dev/null
补充:前后台调度:
前台命令 --->ctlr+z---> 后台挂起
bg 任务号 后台运行
fg 任务号 调入前台
以vim /etc/fstab 为例演示
- 计划任务(下节内容)
- 终止进程
- kill [-9] 进程号
此命令是最基本的进程终止工具。通过指定进程号(PID),可以向指定的进程发送信号来终止该进程
- killall [-9] 进程名
此命令允许你通过进程名终止多个进程,而不需要知道它们的 PID。你可以提供进程名作为参数并选择发送特定信号(如 -9)来终止匹配的所有进程
- pkill [-9] 进程名
-t 终端号
-u 登录用户名
以上两个选项都可以结束终端运行
pkill 命令与 killall 类似,也可以通过进程名来终止进程。不同之处在于,pkill 提供了更多的灵活性,可以使用更多的匹配模式来选择要终止的进程,比如正则表达式
总的来说,kill
是针对单个进程号的操作,killall
是根据进程名批量终止进程,而 pkill
则提供更多的匹配选项。在实际使用中,可以根据具体情况选择合适的命令来终止进程。需要注意的是,在使用 -9
选项时要谨慎,因为 SIGKILL 会强制终止进程,可能会导致数据丢失或其他问题
Ctrl+c 终止前台当前进程
计划任务:计划任务是指未来我们准备在系统中进行的操作通过脚本的方式在规定的时间内自动执行,可以多次进行执行
计划任务
- 一次性计划任务at
设置格式:
at [HH:MM ] [yyyy-mm-dd]
at>要运行的命令
Ctrl+d提交
例:
at 09:00 2024-03-28
at> your_command_here
Ctrl+d
atq 查看计划任务
atrm 任务号 删除某个任务
date 执行该命令后,系统会返回当前的日期和时间信息
date +%T
执行该命令后,系统会返回当前的时间,格式为时:分:秒
date +%F
系统会返回当前的日期,例如 2024-03-28,以年-月-日的格式显示
- 周期性计划任务cron
crontab命令格式
crontab -e [-u 用户名]
用于编辑当前用户的定时任务列表。通过此命令,您可以添加、修改或删除定时任务,-u 用户名:指定要编辑的用户的定时任务列表。如果没有指定用户名,则默认编辑当前用户的定时任务
crontab -l [-u 用户名]
用于列出当前用户的定时任务列表。执行该命令会显示当前用户的所有定时任务,-u 用户名:指定要列出的用户的定时任务列表。如果没有指定用户名,则默认显示当前用户的定时任务
crontab -r [-u 用户名]
用于删除当前用户的定时任务列表。执行该命令将删除当前用户的所有定时任务,-u 用户名:指定要删除的用户的定时任务列表。如果没有指定用户名,则默认删除当前用户的定时任务
任务设置格式:
分 时 日 月 星期 命令(绝对路径)
如果不知到要输的命令的绝对路径可以查一下:which 要查看的命令,或tyep 要查看的命令
设置以其他用户身份执行的任务:
crontab -e -u zhangsan
0 2 * * * /usr/bin/cp /etc/passwd /opt/passwd-$(date +%F)
解析:
- 0 2 * * *:表示在每天凌晨2点整执行以下命令。
- /usr/bin/cp:指定要运行的 cp 命令,用于复制文件或目录。
- /etc/passwd:源文件路径,将会被复制到目标路径。
- /opt/passwd-$(date +%F):目标文件路径为 /opt/passwd-当前日期。$(date +%F) 是一个 shell 命令替换,将会被当前日期替换,格式为 YYYY-MM-DD。
因此,这条计划的作用是在每天凌晨2点,将 /etc/passwd 文件复制到 /opt 目录下,并以当前日期命名副本文件
crontab -l -u zhangsan
crontab -r -u zhangsan #清空zhangsan用户的所有任务,慎用
时间数值的特殊表示方法:
* 表示该范围内的任意时间
, 表示间隔的多个不连续时间点
- 表示一个连续的时间范围
/ 指定间隔的时间频率
示例如下:
0 22 * * 1,3,5 每周一三五22点整
30 23 * * 1-5 周一到周五每天23:30
0 10-22/2 * * * 10点到22点之间每2小时
*/5 * * * * 每5分钟
应用举例:
每天6:00启动sshd服务,23点50时关闭
每3天0点清空一次FTP服务器公共目录/var/ftp/pub
每周日的23:30时,重新启动httpd服务
每周一、三、五的0:30时,打包备份/etc/httpd目录
- 6 * * * /usr/bin/systemctl start sshd
- 23 * * * /usr/bin/systemctl stop sshd
- */3 * * /usr/bin/rm -rf /var/ftp/pub/*
- 23 * * 7 /usr/bin/systemctl restart httpd
30 0 * * 1,3,5 /usr/bin/tar zcf /opt/httpd-$(date +%F).tar.gz /etc/httpd
解析:
- 30 0 * * 1,3,5:表示在每周的星期一、星期三和星期五的午夜(00:30)执行以下命令。
- /usr/bin/tar:指定要运行的 tar 命令。
- zcf:tar 命令的选项,含义是压缩、创建归档文件、使用 gzip 压缩。
- /opt/httpd-$(date +%F).tar.gz:创建的归档文件名为 /opt/httpd-当前日期.tar.gz。
- $(date +%F) 是一个 shell 命令替换,将会被当前日期替换,格式为 YYYY-MM-DD。
- /etc/httpd:指定要压缩的目录是 /etc/httpd。
因此,这条计划的作用是在每周的星期一、星期三和星期五的午夜30分,对 /etc/httpd 目录进行压缩,并将压缩后的归档文件保存为 /opt/httpd-当前日期.tar.gz
问题:如何实现只保留两周之内的备份?
10 2 * * * /usr/bin/rm -rf /opt/passwd-$(date -d “-14 day” +%F)
解析:
- 10 2 * * *:表示在每天凌晨2点10分执行以下命令。
- /usr/bin/rm:指定要运行的 rm 命令,用于删除文件或目录。
- -rf:rm 命令的选项,含义是递归删除目录并强制执行,即无需确认。
- /opt/passwd-$(date -d "-14 day" +%F):要删除的目标文件或目录名为 /opt/passwd-14天前日期。$(date -d "-14 day" +%F) 是一个 shell 命令替换,将会被计算出的14天前的日期替换,格式为 YYYY-MM-DD。
因此,这条计划的作用是在每天凌晨2点10分,删除 /opt 目录下名为 passwd-14天前日期 的目录(及其内容),使用 -rf 选项确保递归删除并且不需要确认
问题:如何实现每20秒创建一个文件?
要实现每隔 20 秒创建一个文件,可以通过编写一个脚本,并结合使用 crontab 来定时执行这个脚本。下面是一个示例方法:
- 创建一个 Bash 脚本,比如 create_file.sh,内容如下:
#!/bin/bash
while true
do
touch /path/to/directory/file-$(date +"%Y%m%d%H%M%S").txt #请将脚本中的 /path/to/directory/ 替换为你想要创建文件的目录路径
sleep 20
done
+"%Y%m%d%H%M%S"
是 date
命令的参数,它指定了日期和时间的格式。在这里,%Y
表示四位数的年份,%m
表示两位数的月份,%d
表示两位数的日期,%H
表示小时(24 小时制),%M
表示分钟,%S
表示秒
因此,$(date +"%Y%m%d%H%M%S")
的作用是获取当前的年月日时分秒信息,并以指定的格式返回这个时间字符串。在这个脚本中,这个时间字符串被用于生成文件名,以确保每个创建的文件名都是唯一的,避免文件名冲突
- 授予脚本执行权限:
chmod +x create_file.sh
- 编辑 crontab:
crontab -e
- 在 crontab 中添加一行来定时执行该脚本,比如每分钟执行一次:
* * * * * /path/to/create_file.sh
这样,脚本会在每分钟的整点时运行一次,然后在其中每隔 20 秒创建一个文件。虽然无法做到精确每隔 20 秒执行一次,但通过这种方式可以实现大致的每隔 20 秒创建一个文件的效果