程序和进程的关系
1.程序
保存在硬盘,光盘等介质中的可执行代码和数据
文件中静态保存的代码
2.进程
在CPU及内存中运行的程序代码
动态执行的代码
父,子进程
每个程序可以创建一个或多个进程
补充:
进程:资源分配的最小单位
线程:程序执行的最小单位
进程:是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(cpu时间,内存等)的基本单位
线程:是cpu调度的最小单位(程序执行流的最小单位),它被包含在进程之中,是进程中的实际运作单元。一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务
僵尸进程:一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init来接管它,成为他的父进程,子进程退出后init会回收其占用的相关资源
但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程
总的来说:进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)
查看进程:ps命令
ps 即 process state,可以进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/数字 目录下的各文件中
查看静态的进程统计信息
ps [选项]复制代码
支持三种选项:
- UNIX选项 如: -A -e
- GNU选项 如: –help
- BSD选项 如: a
- "ps aux" 可以查看系统中所有的进程;
- "ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
- "ps -l" 只能看到当前 Shell 产生的进程;
常用选项
- a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。
- u:使用以用户为主的格式输出进程信息。
- x:显示当前用户在所有终端下的进程信息。
- -e:显示系统内的所有进程信息。
- -l:使用长(Long)格式显示进程信息。
- -f:使用完整的(Full)格式显示进程信
- k|–sort 属性 对属性排序,属性前加 – 表示倒序
方法一:
查看静态的进程统计信息
- ps aux
- a: 显示终端上的所有进程,包括其它用户的进程
- u: 表示列出进程的用户
- x: 显示所有终端的进程
各列解释:
表头 | 含义 |
USER | 该进程是由哪个用户产生的。 |
PID | 进程的 ID。 |
%CPU | 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。 |
%MEM | 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。 |
VSZ | 该进程占用虚拟内存的大小,单位为 KB。 |
RSS | 该进程占用实际物理内存的大小,单位为 KB。 |
TTY | 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。 |
STAT | 进程状态。常见的状态有以下几种: -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。 -R:该进程正在运行。 -S:该进程处于睡眠状态,可被唤醒。 -T:停止状态,可能是在后台暂停或进程处于除错状态。 -W:内存交互状态(从 2.6 内核开始无效)。 -X:死掉的进程(应该不会出现)。 -Z:僵尸进程。进程已经中止,但是还是占用硬件资源。 -<:高优先级(以下状态在 BSD 格式中出现)。 -N:低优先级。 -L:被锁入内存。 -s:包含子进程。 -l:多线程(小写 L)。 – :位于后台。 |
START | 该进程的启动时间。 |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间。 |
COMMAND | 产生此进程的命令名。 |
方法二:
查看静态的进程统计信息
- ps -elf
- e: 显示系统内的所有进程信息
- l: 使用长格式显示进程信息
- f: 使用完整的格式显示进程信息
各列解释:
表头 | 含义 |
F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限; |
S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
UID | 运行此进程的用户的 ID; |
PID | 进程的 ID; |
PPID | 父进程的 ID; |
C | 该进程的 CPU 使用率,单位是百分比; |
PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改 |
NI | 进程的优先级,数值越小,该进程越早被执行;可以人为修改 |
ADDR | 该进程在内存的哪个位置; |
SZ | 该进程占用多大内存; |
WCHAN | 该进程是否运行。"-"代表正在运行; |
TTY | 该进程由哪个终端产生; |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
CMD | 产生此进程的命令名; |
查看进程信息:top
查看动态的进程排名信息
top复制代码
查看动态的进程排名信息
top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。
命令的输出主要分为两部分:
- 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的。
- 第二部分从第六行开始,显示的是系统中进程的信息。
进程动态行
进程信息区
- PID:进程的 ID。
- USER:该进程所属的用户。
- PR:优先级,数值越小优先级越高。
- NI:优先级,数值越小、优先级越高。
- VIRT:该进程使用的虚拟内存的大小,单位为 KB。
- RES:该进程使用的物理内存的大小,单位为 KB。
- SHR:共享内存大小,单位为 KB。
- S:进程状态。
- %CPU:该进程占用 CPU 的百分比。
- %MEM:该进程占用内存的百分比。
- TIME :该进程共占用的 CPU 时间。
- COMMAND:进程的命令名。
常用命令
- tty终端
- Centos7系统,tty1表示图形界面,tty2-tty6表示文字界面,可以用Ctrl Alt F1-F6切换
- pts说明是用远程工具连接的,比如xshell,后面的数字代表登录的时间顺序,越小证明登录的越早
- 查看线程 top -H;ps -T
查看进程信息:pgrep
查看指定的进程
- -U 指定用户
- -l: 显示进程名
- -a: 显示完整格式的进程名
- -P pid: 显示指定进程的子进程
示例:
[root@test ~]# pgrep -l "log"# 显示进程名435 xfs-log/dm-0713 xfs-log/sda1790 xfs-log/md5877 systemd-logind885 abrt-watch-log886 abrt-watch-log890 rsyslogd[root@test ~]# pgrep -l -U hope#指定用户复制代码
查看指定的进程:prtstat命令
格式:
prtstat [选项] [PID|USER]复制代码
常用选项
-r :格式显示(raw)
– 示例
[root@localhost ~]# prtstat 1Process: systemd State: S (sleeping) CPU#: 1 TTY: 0:0 Threads: 1Process, Group and Session IDs Process ID: 1 Parent ID: 0 Group ID: 1 Session ID: 1 T Group ID: -1Page Faults This Process (minor major): 23637 61 Child Processes (minor major): 445262 225CPU Times This Process (user system guest blkio): 0.13 0.88 0.00 0.08 Child processes (user system guest): 1.03 1.45 0.00Memory Vsize: 198 MB RSS: 7000 kB RSS Limit: 18446744073709 MB Code Start: 0x557f40c9c000 Code Stop: 0x557f40de5840 Stack Start: 0x7ffc86deebc0 Stack Pointer (ESP): 0x7ffc86deddc0 Inst Pointer (EIP): 0x7f4dd0af6923Scheduling Policy: normal Nice: 0 RT Priority: 0 (non RT)复制代码
– prtstat -r,格式显示
[root@localhost ~]# prtstat -r 1 pid: 1 comm: systemd state: S ppid: 0 pgrp: 1 session: 1 tty_nr: 0 tpgid: -1 flags: 402100 minflt: 23643 cminflt: 447409 majflt: 61 cmajflt: 225 utime: 13 stime: 89 cutime: 105 cstime: 145 priority: 20 nice: 0 num_threads: 1 itrealvalue: 0 starttime: 3 vsize: 198348800 rss: 1709 rsslim: 18446744073709551615 startcode: 94005036171264 endcode: 94005037520960 startstack: 140722571242432 kstkesp: 7FFC86DEDDC0 kstkeip: 7F4DD0AF6923 wchan: 18446744071581251950 nswap: 0 cnswap: 18446744071581251950 exit_signal: 17 processor: 1 rt_priority: 0 policy: 0 delayaccr_blkio_ticks: 8 guest_time: 0 cguest_time: 0复制代码
以树形结构列出进程信息:pstree
格式:
pstree [选项] [ PID | USER ] 复制代码
常用选项
- -a:显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。
- -p:显示PID。
- -p < pid> : 显示指定进程及其子进程,同时显示每个进程的PID。
- -u:显示进程的用户名称。
- -u 用户名:显示指定用户的进程。
- -H < pid>:高亮显示指定进程及其前辈进程。
- -T:不显示线程thread,默认显示线程。
示例:
列举被打开的文件:lsof
lsof 命令,“list opened files”的缩写,直译过来,就是列举系统中已经被打开的文件。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。
lsof [选项]复制代码
选项 | 功能 |
-c 字符串 | 只列出以字符串开头的进程打开的文件。 |
d 目录名 | 列出某个目录中所有被进程调用的文件。 |
-u 用户名 | 只列出某个用户的进程打开的文件。 |
-p pid | 列出某个 PID 进程打开的文件。 |
示例:
[root@localhost ~]# lsof | more#查询系统中所有进程调用的文件[root@localhost ~]# lsof -p 1#查询以1为PID进程打开的文件复制代码
监控系统资源:vmstat
如果你想动态的了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源,就可以使用 vmstat 命令。
vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。
第一种方法
[root@localhost ~]# vmstat [-a] [刷新延时 刷新次数][root@localhost proc]# vmstat 1 3#使用vmstat检测,每隔1秒刷新一次,共刷新3次复制代码
字段 | 含义 |
procs | 进程信息字段: -r:等待运行的进程数,数量越大,系统越繁忙。 -b:不可被唤醒的进程数量,数量越大,系统越繁忙。 |
memory | 内存信息字段: -swpd:虚拟内存的使用情况,单位为 KB。 -free:空闲的内存容量,单位为 KB。-buff:缓冲的内存容量,单位为 KB。-cache:缓存的内存容量,单位为 KB。 |
swap | 交换分区信息字段: -si:从磁盘中交换到内存中数据的数量,单位为 KB。 -so:从内存中交换到磁盘中数据的数量,单位为 KB。这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。 |
io | 磁盘读/写信息字段: -bi:从块设备中读入的数据的总量,单位是块。 -bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。 |
system | 系统信息字段: -in:每秒被中断的进程次数。 -cs:每秒进行的事件切换次数。这两个数越大,代表系统与接口设备的通信越繁忙。 |
cpu | CPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比 |
通过分析 vmstat 命令的执行结果,可以获得一些与当前 Linux 运行性能相关的信息。比如说:
- r 列表示运行和等待 CPU 时间片的进程数,如果这个值长期大于系统 CPU 的个数,就说明 CPU 不足,需要增加 CPU。
- swpd 列表示切换到内存交换区的内存数量(以 kB 为单位)。如果 swpd 的值不为 0,或者比较大,而且 si、so 的值长期为 0,那么这种情况下一般不用担心,不用影响系统性能。
- cache 列表示缓存的内存数量,一般作为文件系统缓存,频繁访问的文件都会被缓存。如果缓存值较大,就说明缓存的文件数较多,如果此时 I/O 中 bi 比较小,就表明文件系统效率比较好。
- 一般情况下,si(数据由硬盘调入内存)、so(数据由内存调入硬盘) 的值都为 0,如果 si、so 的值长期不为 0,则表示系统内存不足,需要增加系统内存。
- 如果 bi bo 的参考值为 1000 甚至超过 1000,而且 wa 值较大,则表示系统磁盘 I/O 有问题,应该考虑提高磁盘的读写性能。
- 输出结果中,CPU 项显示了 CPU 的使用状态,其中当 us 列的值较高时,说明用户进程消耗的 CPU 时间多,如果其长期大于 50%,就需要考虑优化程序或算法;sy 列的值较高时,说明内核消耗的 CPU 资源较多。通常情况下,us sy 的参考值为 80%,如果其值大于 80%,则表明可能存在 CPU 资源不足的情况。
总的来说,vmstat 命令的输出结果中,我们应该重点注意 procs 项中 r 列的值,以及 CPU 项中 us 列、sy 列和 id 列的值。
第二种方法
格式:
[root@localhost ~]# vmstat [选项] 复制代码
- 下表罗列出了 vmstat 命令的第二种基本格式中常用的选项及各自的含义。
选项 | 含义 |
-fs | -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。 |
-S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
-d | 列出硬盘有关读写总量的统计表。 |
-p 分区设备文件名 | 查看硬盘分区的读写情况。 |
进程启动方式(控制进程)
1、手工启动
- 前台启动:用户输入命令,直接执行程序
- 后台启动:在命令行尾加入“&”符号
"命令 &",把命令放入后台执行
把命令放入后台的方法是在命令后面加入 空格 &。使用这种方法放入后台的命令,在后台处于执行状态。
注意,放入后台执行的命令不能与前台有交互,否则这个命令是不能在后台执行的
例子:使用sleep命令查看前台启动和后台启动区别
前台运行:
后台运行:
调度启动
- 使用at命令,设置一次性计划任务。
- 使用crontab命令,设置周期性计划任务。
调度启动在下文 ” 8 计划任务管理 “ 中详细介绍。
进程的前后台调度(作业控制)
命令:
& //在命令行尾加入“&”符号,把命令放到后台执行。 Ctrl Z 组合键 //将当前进程挂起,即调入后台并停止执行。 jobs //查看处于后台的任务列表。 fg 任务序号 //将后台进程恢复到前台运行,可指定任务序号。 bg 任务序号 //将一个在后台暂停的任务,变成继续执行。复制代码
示例:
- &
[root@localhost etc]# sleep 60 &[1] 54364复制代码
- Ctrl Z组合键
- 将当前进程挂起,即调入后台并停止执行
- 处于后台的任务:jobs
jobs 【- l】复制代码
- 恢复挂起命令到前台执行:fg
fg 1复制代码
- bg 任务序号,将一个在后台暂停的任务,变成继续执行
[root@localhost 9527]# dd if=/dev/zero of=/data/11 bs=1G count=5 //执行后,使用ctrl z将该进程挂起^Z[1] 已停止 dd if=/dev/zero of=/data/11 bs=1G count=5[root@localhost 9527]# jobs //查看后台任务列表,任务是停止状态[1] 已停止 dd if=/dev/zero of=/data/11 bs=1G count=5[root@localhost 9527]# bg 1 //让暂停的后台任务,变成继续执行[1] dd if=/dev/zero of=/data/11 bs=1G count=5 &[root@localhost 9527]# jobs //查看任务列表,进程是运行状态[1] 运行中 dd if=/dev/zero of=/data/11 bs=1G count=5 &[root@localhost 9527]# 记录了5 0 的读入 //已经完成了运行的进程记录了5 0 的写出5368709120字节(5.4 GB)已复制,15.9937 秒,336 MB/秒复制代码
进程的优先级设置
每个CPU在一个时间点上只能处理一个进程,通过时间分片技术,来同时运行多个进程。每个进程都有相应的优先级,优先级决定它何时运行和接收多少 CPU 时间。
在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice。数值越小,优先级越高,该进程越优先被 CPU 处理。
不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。
PRI 和 NI 的关系如下:
PRI (最终值) = PRI (原始值) NI复制代码
所有的优先级范围为0-139,一共140个优先级,数值越低优先级越高
优先级范围100-139称为静态优先级,这个范围里的进程属于非实时进程,调度方式是:SCHED_OTHER,也就是SCHED_OTHER,使用CFS算法调度(时间片)
优先级范围0-99称为动态优先级,这个范围里的进程属于实时进程,调度方式有:SCHED_FIFO和SCHED_RR(默认); SCHED_FIFO:高优先级会抢占低优先级,高优先级运行期间,低优先级没法抢占,只能等到高优先级主动退出;对于同等优先级,先运行的进程会一直占据cpu, 只有等到先运行的进程主动退出,后续进程才能得到时间片。 SCHED_RR:高优先级会抢占低优先级,高优先级运行期间,低优先级没法抢占,只能等到高优先级主动退出;对于同等优先级的进程,各个进程会轮流运行一定的时间片(大约100ms)。
通过ps查看,大部分的普通进程的PRI=80,而不是认为的120,这是因为ps的计算方法是-40~99是整个进程优先级范围,而60~99是普通进程,-40~59是实时进程; TOP命令显示非RT线程时,PR字段的取值是把task的prio减去100,所以看到的值是0~39
修改 NI 值时有几个注意事项:
- NI 范围是 -20~19。
- 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
- 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
- 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
nice命令——启动具有不同nice级别的进程
启动进程时,进程通常会继承父进程的nice级别,默认为0。
可以在启动程序时,加上nice命令来设置程序运行的优先级
命令格式:
nice -n 优先级别 执行命令复制代码
示例: 将nice级别为-1
[root@localhost ~]# nice -n -5 dd if=/dev/zero of=/data/11 bs=1G count=5 & //启动程序时,设置nice级别为-1 [2] 29289 [root@localhost ~]# top -p 29289复制代码
renice命令——更改现有进程的nice级别
命令格式:
renice -n 优先级 -p PID //修改现有进程的nice级别复制代码
示例: 先使用top命令查看sshd进程pid为1965,nice级别为0,使用renice命令修改成-5
[root@localhost ~]# renice -n -5 -p 1965 //将sshd进程的nice级别修改为-5 1965 (进程 ID) 旧优先级为 0,新优先级为 -5 [root@localhost ~]# top -p 1965 //修改后的nice级别为-5复制代码
结束进程
1. ctrl c组合键
ctrl c,结束进程,中断正在执行的命令
[root@localhost 9527]# dd if=/dev/zero of=/data/11 bs=1G count=5^C记录了0 1 的读入 //ctrl c组合键中断了dd指令记录了0 0 的写出0字节(0 B)已复制,0.597625 秒,0.0 kB/秒复制代码
2.kill、killall命令
2.1 kill
kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。
也就是说,kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。
kill [信号] PID kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。Linux 定义了几十种不同类型的信号,读者可以使用 kill -l 命令查看所有信号及其编号,这里仅列出几个常用的信号复制代码
信号编号 | 信号名 | 含义 |
0 | EXIT | 程序退出时收到该信息。 |
1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl C" 组合键发出就是一个 kill -2 的信号。 |
3 | QUIT | 退出。 |
9 | KILL | 杀死进程,即强制结束进程。 |
11 | SEGV | 段错误。 |
15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
示例:
2.2killall
killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用
killall [选项] [信号] 进程名复制代码
- -i:交互式,询问是否要杀死某个进程;
- -I:忽略进程名的大小写;
3. pkill
当作于管理进程时,pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程,该命令的基本格式如下:
pkill [信号] 进程名复制代码
信号编号 | 信号名 | 含义 |
0 | EXIT | 程序退出时收到该信息。 |
1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl C" 组合键发出就是一个 kill -2 的信号。 |
3 | QUIT | 退出。 |
9 | KILL | 杀死进程,即强制结束进程。 |
11 | SEGV | 段错误。 |
15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
pkill命令踢出登陆用户
pkill [-t 终端号] 进程名 -U:根据进程所属的用户名终止相应进程-t:根据进程所在的终端终止相应进程复制代码
使用 killall 命令时,不知道大家发现没有,通过 killall 命令杀死 sshd 进程的方式来踢出用户,非常容易误杀死进程,要么会把 sshd 服务杀死,要么会把自己的登录终端杀死。
所以,不管是使用 kill 命令按照 PID 杀死登录进程,还是使用 killall 命令按照进程名杀死登录进程,都是非常容易误杀死进程的,而使用 pkill 命令则不会
w#使用w命令查询本机已经登录的用户pkill -9 -t pts/1#强制杀死从pts/1虚拟终端登陆的进程[root@localhost ~]#pgrep -l -u "zhangsan"4491 bash[root@localhost ~]#pkill -9 -U zhangsan[root@localhost ~]#pgrep -l -u "zhangsan"复制代码
任务计划管理
一次性任务设置at
at 工具
- 由包 at 提供
- 依赖与atd服务,需要启动才能实现at任务
- at队列存放在/var/spool/at目录中,ubuntu存放在/var/spool/cron/atjobs目录下
- 执行任务时PATH变量的值和当前定义任务的用户身份一致
at 命令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件来实现的,具体规则如下:
- 如果系统中有 /etc/at.allow 文件,那么只有写入 /etc/at.allow 文件(白名单)中的用户可以使用 at 命令,其他用户不能使用 at 命令(注意,/etc/at.allow 文件的优先级更高,也就是说,如果同一个用户既写入 /etc/at.allow 文件,又写入 /etc/at.deny 文件,那么这个用户是可以使用 at 命令的)。
- 如果系统中没有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件(黑名单)中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效。
- 如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令。
系统中默认只有 /etc/at.deny 文件,而且这个文件是空的,因此,系统中所有的用户都可以使用 at 命令。不过,如果我们打算控制用户的 at 命令权限,那么只需把用户写入 /etc/at.deny 文件即可
命令格式:
at设置任务:
at [选项] [时间][HH:MM] [yyyy-mm-dd]#设置具体任务后,按 ctrl d 提交 。 #若设置具体任务时,想要退格重写,按ctrl backspace进行退格。复制代码
at任务查询和删除:
atq //查看at任务列表 atrm [工作号] //删除指定的at任务复制代码
时间格式:
格式 | 用法 |
HH:MM | 比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。 |
Midnight(midnight) | 代表 12:00 AM(也就是 00:00)。 |
Noon(noon) | 代表 12:00 PM(相当于 12:00)。 |
Teatime(teatime) | 代表 4:00 PM(相当于 16:00)。 |
英文月名 日期 年份 | 比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。 |
MMDDYY、MM/DD/YY、MM.DD.YY | 比如 011518 表示 2018 年 1 月 15 号。 |
now 时间 | 以 minutes、hours、days 或 weeks 为单位,例如 now 5 days 表示命令在 5 天之后的此时此刻执行。 |
HH:MM 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务04:00 //表示在今天4点执行任务。若过了4点,那就是明天4点HH:MM YYYY-MM-DD 规定在某年某月的某一天的特殊时刻进行该项任务02:00 2020-09-20 //在2020年9月20日执行任务HH:MM[am|pm] [Month] [Date] //指定上午或者下午06pm March 17 //在3月17日下午6点执行17:20 tomorrow //明天的17点20分执行HH:MM[am|pm] number [minutes|hours|days|weeks] //在某个时间点再加几个时间后才进行该项任务now 5 min //现在的五分钟后执行03pm 2 days //在2天后的下午3点执行复制代码
示例:
周期性任务设置crontab
crontab命令简介
- 按照预先设置的时间周期(分钟、小时、天……)重复执行用户指定的命令操作。
- 属于周期性计划任务。
- 主要设置文件。
- 全局配置文件,位于文件:/etc/crontab
- 系统默认的设置,位于目录:/etc/cron.*/
- 用户定义的设置,位于文件:/var/spool/cron/用户名
查看/etc/crontab文件:
- 命令格式:
crontab -e [-u 用户名] //编辑计划任务 crontab -l [-u 用户名] //查看计划任务 crontab -r [-u 用户名] //删除计划任务 #-u选项缺省时默认针对当前用户,只有超级用户才可以使用-u复制代码
使用 "crontab -e" 进入 crontab 编辑界面。会打开vim编辑你的任务,输入格式为:
* * * * * 需要执行的任务 #即:时间周期设置 任务内容设置。 #任务内容设置中,命令一定要用绝对路径,例如cp命令,要用/usr/bin/cp,可以用which查看命令的绝对路径复制代码
- 任务配置格式
项目 | 含义 | 范围 |
第一个"*" | 一小时当中的第几分钟(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 分钟就执行一次命令。 |
示例
• 0 17 * * 1-5
周一到周五每天17:00
• 30 8 * * 1,3,5
每周一、三、五的8点30分
• 0 8-18/2 * * *
8点到18点之间每2小时
• 0 * */3 * *
每3天
crontab -e [-u root]
1.每分钟定时执行一.次规则:
每1分钟执行: * /1 * * * * 或者 * * * * *
每5分钟执行: * /5 * * * *
2.每小时定时执行一次规则:
每小时执行: 0 * * * * 或者 0 * /1 * * *
每天.上午7点执行: 0 7 * * *
每天上午7点10分执行: 10 7 * * *
3.每天定时执行一次规则:
每天执行 0 0 * * *
4.每周定时执行一次规则:
每周执行 0 0 * *1
5.每月定时执行一次规则:
每月执行 0 0 1 * *
6.每年定时执行–次规则:
每年执行 0 0 1 1 *
其他例子
5 * * * * ls
指定每小时的第5分钟执行一次ls命令
30 5 * * * ls
指定每天的5:30执行ls命令
30 7 8 * * ls
指定每月8号的7: 30分执行ls命令
30 5 8 6 * ls
指定每年的6月8日5: 30执行ls命令
30 6 * * 0 ls
指定每星期日的6:30执行ls命令
[注: 0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等]
30 3 10,20 * * ls
每月10号及20号的3: 30执行ls命令
[注: “,"用来连接多个不连续的时段]
25 8-11 * * * ls
每天8-11点的第25分钟执行ls命令
[注: “-”用来连接连续的时段]
*/15 * * * * ls
每15分钟执行一次ls命令
[ 即每个小时的第 0 15 30 45 60分钟执行ls命令]
30 6 */10 * * ls
每个月中,每隔10天6:30执行一 次ls命令
[即每月的1、11、21、31日是的6: 30执行一次ls命令 ]
*/10 10-16 * 1,6 6 /usr/bin/ls -l
1,6月的每个周六从上午10点到下午的4点的每10分钟执行ls -l
总结
• 查看进程的命令(ps、 top、pgrep、 pstree)
• 进程控制
启动进程、调度进程、终止进程
• at命令 设置计划任务 (一次性任务)
• crontab计划任务的配置字段 (周期性任务)
作者:MrHOPE
链接:https://juejin.cn/post/7078235831567122462
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。