计划任务cron

## 一、一次性计划任务 at

**at工具**

- 由 at 软件包提供设置计划任务命令,其中软件包还提供 batch命令,系统自行选择空闲时间去执行此处指定的任务。

- at 执行任务时PATH变量的值和当前定义任务的用户身份一致

- at 计划任务依赖于atd.service 服务,有atd.service监控时间,定时执行at计划的任务。

  ```sh
  [root@centos7 ~ ]# yum install -y at
  [root@centos7 ~ ]# systemctl is-active atd.service
  active
  ```

**at命令常用参数**

| 参数                | 含义                                                         |
| ------------------- | ------------------------------------------------------------ |
| at -l               | 查看at命令创建的计划任务;相当于 atq                         |
| at -d <任务编号>    | 删除指定编号计划任务;相当于 atrm                            |
| at -c <任务编号>    | 查看指定编号的任务;相当于cat /var/spool/at/目录下对应脚本文件 |
| at -f <文件> <时间> | at命令接收标准输入信息,即:从指定文件中读取任务             |
| at -m               | 当任务被完成之后,将给用户发送邮件,即使没有标准输出         |
| at -t <时间>        | 定义时间格式                                                 |

**查看当前等待运行的工作任务**

```sh
atq
```

```sh
[user1@localhost ~]$ atq
6    Sun Oct 03 20:30:00 2021 a user1
```

**删除当前等待运行的任务**

```sh
[user1@localhost ~]$ atrm 6
[user1@localhost ~]$ atq      #再查看就没有了。
```


## 二、crontab循环多次执行
### 1.crontab用法

|参数|含义|
|-------|-------|
|*|每分钟每小时 每一天 每月 每星期|
|*/n|每隔n分钟每隔n小时 每隔n天 每隔n月 每隔n个星期|
|n,m|n和m分钟 n和m小时 n和m天n和m月n和m星期|
|n-m|n到m每分钟 n到m每小时 n到m每天n到m每月 n到m每星期|

**每个*对应的时间为**

```
* * * * *
分 时 日 月 周
```

### 2. cron 用户计划任务

crontab命令

-   每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME 
-   默认标准输出和错误会被发邮件给对应的用户,如:testuser创建的任务就发送至testuser的邮箱
-   root能够修改其它用户的作业 ,普通用户只能修改自己的计划任务。
-   用户的cron 中默认 PATH=/usr/bin:/bin,如果使用其它路径,在任务文件的第一行定义PATH路径
-   计划任务执行脚本需要执行权限。

crontab命令参数

| 参数                                       | 含义                                   |
| ------------------------------------------ | -------------------------------------- |
| crontab -e                                 | 调用vi编辑器,编写用户计划任务         |
| crontab -l                                 | 查看用户的计划任务                     |
| crontab -r                                 | 删除全部用户计划任务                   |
| crontab -i                                 | 同-r一同使用,以交互式模式移除指定任务 |
| crontab -u <用户> [ -e \| -l \| -r \| -i ] | 仅root可运行,指定用户管理cron任务     |

crontab默认调用vi编辑器,编写内容不带颜色,可以自定义调用的编辑器

anacron

   作用:执行因为服务器因为异常或者关机导致的没有被执行的定时任务
   
   配置文件:
```
    [root@localhost ~]# vi /etc/anacrontab
    # /etc/anacrontab: configuration file for anacron
    # See anacron(8) and anacrontab(5) for details.
    SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
    #前面的内容和/etc/crontab类似
    #the maximal random delay added to the base delay of the jobs
    RANDOM_DELAY=45
    #最大随机廷迟,如果有大量的未执行,如果开机后立即执行可能会严重影响性能
    #the jobs will be started during the following hours only
    START_H0URS_RANGE=3-22
    #fanacron的执行时间范围是3:00~22:00
    #period in days delay in minutes job-identifier command
    1 5 cron.daily nice run-parts /etc/cron.daily
    #每天开机 5 分钟后就检查 /etc/cron.daily 目录内的文件是否被执行,如果今天没有被执行,那就执行
    7 25 cron.weekly nice run-parts /etc/cron.weekly
    #每隔 7 天开机后 25 分钟检查 /etc/cron.weekly 目录内的文件是否被执行,如果一周内没有被执行,就会执行
    ©monthly 45 cron.monthly nice run-parts /etc/cron.monthly
    #每隔一个月开机后 45 分钟检查 /etc/cron.monthly 目录内的文件是否被执行,如果一个月内没有被执行,那就执行 
```

### 3.查看正在运行的进程

ps 命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息。

ps 命令的基本格式如下:

```apl
[root@localhost ~]# ps -aux
#查看系统中所有的进程,使用 BSD 操作系统格式
[root@localhost ~]# ps -le
#查看系统中所有的进程,使用 Linux 标准命令格式
```

选项:
```
a:显示一个终端的所有进程,除会话引线外;
 u:显示进程的归属用户及内存的使用情况;
 x:显示没有控制终端的进程;
 l:长格式显示更加详细的信息;
 e:显示所有进程;
```

大家如果执行 "man ps" 命令,则会发现 ps 命令的帮助为了适应不同的类 UNIX 系统,可用格式非常多,不方便记忆。所以,我建议大家记忆几个固定选项即可。比如:

```
① "ps aux" 可以查看系统中所有的进程;
② "ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
③ "ps -l" 只能看到当前 Shell 产生的进程;
```
**ps -aux**

```
 名称解释
      USER: 当前运行进程的拥有者
      
      PID:进程ID
      
      %CPU:进程占用的CPU百分比
      
      %MEM:进程占用的内存百分比
      
      VSZ:虚拟内存
      
      RSS: 物理内存
      
      TTY:终端类型
          控制台终端:tty1-tty6代表命令行终端,tty7表示图形化终端,tty0代表本地终端
          
          虚拟终端:pts/0-255
          
      STAT:服务状态
      
      START:命令的启动时间
      
      TIME:进程占用CPU处理的时间
      
      COMMAND:命令
      
   httpd    socket:ip+端口
```

### 4. top 持续监听进程运行状态

ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。

为此,Linux 提供了 top 命令。top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。

top 命令的基本格式如下:

```apl
[root@localhost ~]#top [选项]
```

选项:

```apl
 -d: 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;
 -b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
 -n: 次数:指定 top 命令执行的次数。一般和"-"选项合用;
 -p: 进程PID:仅查看指定 ID 的进程;
 -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;
 -u: 用户名:只监听某个用户的进程;


在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:

- ? 或 h:显示交互模式的帮助;
- P:按照 CPU 的使用率排序,默认就是此选项;
- M:按照内存的使用率排序;
- N:按照 PID 排序;
- T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
- k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
- r:按照 PID 给某个进程重设优先级(Nice)值;
- q:退出 top 命令;
```

**僵尸程序**

僵尸进程的产生一般是由于进程非正常停止或程序编写错误,导致子进程先于父进程结束,而父进程又没有正确地回收子进程,从而造成子进程一直存在于内存当中,这就是僵尸进程。

僵尸进程会对主机的稳定性产生影响,所以,在产生僵尸进程后,一定要对产生僵尸进程的软件进行优化,避免一直产生僵尸进程;对于已经产生的僵尸进程,可以在查找出来之后强制中止。

**缓冲(buffer)和缓存(cache)的区别:**
- 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
- 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

**top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:**

```apl
- PID:进程的 ID。
- USER:该进程所属的用户。
- PR:优先级,数值越小优先级越高。
- NI:优先级,数值越小、优先级越高。
- VIRT:该进程使用的虚拟内存的大小,单位为 KB。
- RES:该进程使用的物理内存的大小,单位为 KB。
- SHR:共享内存大小,单位为 KB。
- S:进程状态。
- %CPU:该进程占用 CPU 的百分比。
- %MEM:该进程占用内存的百分比。
- TIME+:该进程共占用的 CPU 时间。
- COMMAND:进程的命令名。
```
**nice修改进程优先级**

修改进程优先级的命令主要有两个:nice,renice

nice是程序开始时指定的,比如:

```sh
nice -n -5 /usr/local/mysql/bin/mysqld_safe &
```

renice是修改已经存在的进程的的nice值

```sh
[root@localhost proc]# renice -n 5 -p 6093
6093 (process ID) old priority 0, new priority 5
```

### 5.Linux常用信号(进程间通信)及其含义

常见信号说明:

| 信号代号 | 信号名称 | 说 明                                                        |
| -------- | -------- | ------------------------------------------------------------ |
| 1        | SIGHUP   | 该信号让进程立即关闭.然后重新读取配置文件之后重启            |
| 2        | SIGINT   | 程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键     |
| 8        | SIGFPE   | 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误 |
| 9        | SIGKILL  | 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。般用于强制中止进程 |
| 14       | SIGALRM  | 时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号 |
| 15       | SIGTERM  | 正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9 |
| 18       | SIGCONT  | 该信号可以让暂停的进程恢复执行。本信号不能被阻断             |
| 19       | SIGSTOP  | 该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断 |

其中最重要的就是 "1"、"9"、"15"这三个信号,我们只需要记住这三个信号即可。

### 6.终止进程 kill、killall、pkill

#### 6.1 kill

kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。

kill 命令的基本格式如下:

```
[root@localhost ~]# kill [信号] PID
```

kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。Linux 定义了几十种不同类型的信号,读者可以使用 kill -l 命令查看所有信号及其编号,这里仅列出几个常用的信号,如表 1 所示

| 信号编号 | 信号名 | 含义                                                         |
| -------- | ------ | ------------------------------------------------------------ |
| 0        | EXIT   | 程序退出时收到该信息。                                       |
| 1        | HUP    | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
| 2        | INT    | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
| 3        | QUIT   | 退出。                                                       |
| 9        | KILL   | 杀死进程,即强制结束进程。                                   |
| 11       | SEGV   | 段错误。                                                     |
| 15       | TERM   | 正常结束进程,是 kill 命令的默认信号。                       |

需要注意的是,表中省略了各个信号名称的前缀 SIG,也就是说,SIGTERM 和 TERM 这两种写法都对,kill 命令都可以理解。

#### 6.1.2终止特定的一类进程:killall

killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用。

killall 命令的基本格式如下:

```apl
[root@localhost ~]# killall [选项] [信号] 进程名
```

注意,此命令的信号类型同 kill 命令一样,因此这里不再赘述,此命令常用的选项有如下 2 个:

- -i:交互式,询问是否要杀死某个进程;
- -I:忽略进程名的大小写;

#### 6.1.3终止进程,按终端号踢出用户:pkill

当作于管理进程时,pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程,该命令的基本格式如下:

```
[root@localhost ~]# pkill [信号] 进程名
```

**pkill命令踢出登陆用户**

除此之外,pkill 还有一个更重要的功能,即按照终端号来踢出用户登录,此时的 pkill 命令的基本格式如下:

```apl
[root@localhost ~]# pkill [-t 终端号] 进程名
```

[-t 终端号] 选项用于按照终端号踢出用户;

学习 killall 命令时,不知道大家发现没有,通过 killall 命令杀死 sshd 进程的方式来踢出用户,非常容易误杀死进程,要么会把 sshd 服务杀死,要么会把自己的登录终端杀死。

所以,不管是使用 kill 命令按照 PID 杀死登录进程,还是使用 killall 命令按照进程名杀死登录进程,都是非常容易误杀死进程的,而使用 pkill 命令则不会


### 7.Linux命令放入后台运行

Linux 命令放入后台的方法有两种,分别介绍如下。

**第一种:"命令 &",把命令放入后台执行**

第一种把命令放入后台的方法是在命令后面加入 `空格 &`。使用这种方法放入后台的命令,在后台处于执行状态。

注意,放入后台执行的命令不能与前台有交互,否则这个命令是不能在后台执行的

```apl
[root@ali01 ~]# ping www.baidu.com >>/dev/null &
[1] 3252
```

**第二种:使用ctrl +Z的方式放入后台,此时进程时暂停的。**

```sh
[root@ali01 ~]# ping www.baidu.com
PING www.wshifen.com (119.63.197.139) 56(84) bytes of data.
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=1 ttl=54 time=3.40 ms
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=2 ttl=54 time=3.44 ms
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=3 ttl=54 time=3.43 ms
^Z
[1]+  Stopped                 ping www.baidu.com
```

#### 7.1.1查看当前终端放入后台的工作:jobs

jobs 命令可以用来查看当前终端放入后台的工作,工作管理的名字也来源于 jobs 命令。

jobs 命令的基本格式如下:

```apl
[root@localhost ~]#jobs [选项]
```

表 1 罗列了 jobs 命令常用的选项及含义。

| 选项           | 含义                                   |
| -------------- | -------------------------------------- |
| -l(L 的小写) | 列出进程的 PID 号。                    |
| -n             | 只列出上次发出通知后改变了状态的进程。 |
| -p             | 只列出进程的 PID 号。                  |
| -r             | 只列出运行中的进程。                   |
| -s             | 只列出已停止的进程。                   |

#### 7.1.2把后台命令恢复在前台执行:fg

前面所讲,都是将工作丢到后台去运行,那么,有没有可以将后台工作拿到前台来执行的办法呢?答案是肯定的,使用 fg 命令即可。

fg 命令用于把后台工作恢复到前台执行,该命令的基本格式如下:

```
[root@localhost ~]#fg %工作号
```

注意,在使用此命令时,% 可以省略,但若将`% 工作号`全部省略,则此命令会将带有 + 号的工作恢复到前台。另外,使用此命令的过程中, % 可有可无。

例如:

```sh
[root@ali01 ~]# fg 1
ping www.baidu.com >> /dev/null
```

#### 7.1.3把后台暂停的工作恢复到后台执行:bg

前面讲过,使用 `Ctrl+Z` 快捷键的方式,可以将前台工作放入后台,但是会处于暂停状态,那么,有没有办法可以让后台工作继续在后台执行呢?答案是肯定的,这就需要用到 bg 命令。

bg 命令的基本格式如下:

```sh
[root@localhost ~]# bg %工作号
```

和 fg 命令类似,这里的 % 可以省略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值