1. linux任务计划cron


linux的大部分系统管理工作都是通过定期自动执行某个脚本来完成的,那么如何定期执行某个脚本呢?这就要借助linux的cron功能了,这部分的内容很重要,请牢记!


命令crontab

linux的任务计划功能的操作都是通过crontab命令来完成的,其常用的选项有以下几个:


-u:表示指定某个用户,不加-u选项则为当前用户。

-e:表示制定计划任务

-l:表示列出计划任务

-r:表示删除计划任务


任务计划的配置文件:

# cat /etc/crontab 

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root


# For details see man 4 crontabs


# Example of job definition:

# .---------------- minute (0 - 59)

# |  .------------- hour (0 - 23)

# |  |  .---------- day of month (1 - 31)

# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...

# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# |  |  |  |  |

# *  *  *  *  * user-name  command to be executed


解释:

格式:分 时 日 月 周 user command

分范围0-59,时范围0-23,日范围1-31,月范围1-12,周1-7(0表示周日,也可以用7表示,也都可以用英文简写sun,mon,tue,wed,thu,fri,sat)


可用格式1-5表示一个范围1到5,如1-5月或者1-5点等。

可用格式1,2,3表示1或者2或者3.如1,2,3月份或者1点,2点,3点或者星期一,星期二,星期三。 

可用格式*/2表示被2整除的数字,比如小时,那就是每隔2小时;月份,那就是偶数月2月,4月,6月等。


使用 crontab -e 来进行编写任务计划,这实际上是使用vim工具打开了crontab的配置文件。crontab -e 是打开了目录文件“/var/spool/cron/username” (如果是root则打开的是/var/spool/cron/root)这个文件,保存时:wq即可,但是请千万不要直接去编辑那个文件,否则会出错,一定要使用命令crontab -e来编辑

启动计划任务服务命令: 

systemctl start crond


停止任务计划服务命令: 

systemctl stop crond

检查服务是否启动命令: 

systemctl status crond 或者查看进程启动命令ps aux |grep cron


# systemctl status crond

● crond.service - Command Scheduler

   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)

   Active: active (running) since 四 2017-11-30 14:00:30 CST; 4 days ago

 Main PID: 506 (crond)

   CGroup: /system.slice/crond.service

           └─506 /usr/sbin/crond -n


1月 29 14:00:30 ccj systemd[1]: Started Command Scheduler.

1月 29 14:00:30 ccj systemd[1]: Starting Command Scheduler...

1月 29 14:00:30 ccj crond[506]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 96% if used.)

1月 29 14:00:30 ccj crond[506]: (CRON) INFO (running with inotify support)

# ps aux |grep cron

root        506  0.0  0.1 126236  1612 ?        Ss   1月29   0:01 /usr/sbin/crond -n

root       8380  0.0  0.0 112676   972 pts/0    S+   20:22   0:00 grep --color=auto cron



2. chkconfig工具

windows系统有开机启动项,linux也同样有开机启动项。在centos6上的开机启动项管理工具为chkconfig,所有的开机启动服务都可以在/etc/init.d/目录看到。但是centos7已经不在用chkconfig管理开机启动项。


# ls /etc/init.d/

functions  netconsole  network  README

使用命令chkconfig --list列出所有的服务及其每个级别的开启状态,如下所示:


# chkconfig --list


注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 

      如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。

      欲查看对特定 target 启用的服务请执行

      'systemctl list-dependencies [target]'。


netconsole      0:关 1:关 2:关 3:关 4:关 5:关 6:关

network         0:关 1:关 2:开 3:开 4:开 5:开 6:关

在这里我们会看到一个提示,它提示我们该命令输出的内容并没有包含Centos 7原生systemd服务,而这里仅仅列出来SysV服务,这也是/etc/init.d/目录下面只有一两个启动脚本的根本原因。也就是说,早期CentOS版本(7之前)采用的服务管理都是Sysv,而7换成了systemd。


运行级别为系统启动级别,具体含义如下: 

0 shutdown关机 

1 单用户模式 

2 无NFS支持的多用户模式 

3 完全多用户模式,常用的命令行模式 

4 保留给用户自定义 

5 图形界面登录,比3多了一个图形界面 

6 重启


运行级别0,1,6作为保留模式。通常做设置时,如果不指定级别,则默认为更改2,3,4,5。


# chkconfig --level 3 network off    关闭3级别的network服务

# chkconfig --list                           查看结果,3级别已关闭


注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 

      如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。

      欲查看对特定 target 启用的服务请执行

      'systemctl list-dependencies [target]'。


netconsole      0:关 1:关 2:关 3:关 4:关 5:关 6:关

network         0:关 1:关 2:开 3:关 4:开 5:开 6:关

# chkconfig --level 345 network off     关闭3,4,5级别的network服务

# chkconfig --list                               查看结果,3、4、5级别已关闭


注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 

      如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。

      欲查看对特定 target 启用的服务请执行

      'systemctl list-dependencies [target]'。


netconsole     0:关 1:关 2:关 3:关 4:关 5:关 6:关

network         0:关 1:关 2:开 3:关 4:关 5:关 6:关

# chkconfig network on        省略级别,默认是针对2、3、4、5操作

# chkconfig --list


注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 

      如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。

      欲查看对特定 target 启用的服务请执行

      'systemctl list-dependencies [target]'。


netconsole     0:关 1:关 2:关 3:关 4:关 5:关 6:关

network         0:关 1:关 2:开 3:开 4:开 5:开 6:关

# chkconfig --del network      删除network服务

# chkconfig --list


注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 

      如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。

      欲查看对特定 target 启用的服务请执行

      'systemctl list-dependencies [target]'。


netconsole      0:关 1:关 2:关 3:关 4:关 5:关 6:关

# chkconfig --add network    添加network服务

# chkconfig --list


注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 

      如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。

      欲查看对特定 target 启用的服务请执行

      'systemctl list-dependencies [target]'。


netconsole      0:关 1:关 2:关 3:关 4:关 5:关 6:关

network         0:关 1:关 2:开 3:开 4:开 5:开 6:关



3. systemd管理服务

列出系统所有服务


# systemctl list-units --all --type=service  

  UNIT                                   LOAD      ACTIVE   SUB     DESCRIPTION

  auditd.service                         loaded    active   running Security Auditing Service

  brandbot.service                       loaded    inactive dead    Flexible Branding Service

  chronyd.service                        loaded    active   running NTP client/server

  cpupower.service                       loaded    inactive dead    Configure CPU power related settings

  crond.service                          loaded    active   running Command Scheduler

  dbus.service                           loaded    active   running D-Bus System Message Bus

● display-manager.service                not-found 


# ls /usr/lib/systemd/system      启动服务对应的脚本文件目录

arp-ethers.service                      lvm2-lvmetad.service                swap.target

auditd.service                          lvm2-lvmetad.socket                 sys-fs-fuse-connections.mount

autovt@.service                         lvm2-lvmpolld.service               sysinit.target

basic.target                            lvm2-lvmpolld.socket                sysinit.target.wants

basic.target.wants                      lvm2-monitor.service                sys-kernel-config.mount

blk-availability.service                lvm2-pvscan@.service                sys-kernel-debug.mount

bluetooth.target                        machine.slice                       syslog.socket

brandbot.path                           machines.target                     syslog.target.wants

brandbot.service                        messagebus.service                  sysstat.service



几个常用的服务相关的命令

systemctl enable crond.service   让服务开机启动

systemctl disable crond              不让开机启动

systemctl status crond               查看状态

systemctl stop crond                 停止服务

systemctl start crond                 启动服务

systemctl restart crond              重启服务

systemctl is-enabled crond        检查服务是否开机启动



4. unit介绍

/usr/lib/systemd/system 此目录下列出了很多文件,这些文件都是unit。

系统所有unit,分为类别如下:

service:系统服务

target :多个unit组成的组

device:硬件设备

mount:文件系统挂载点

automount:自动挂载点

path:文件或路径

scope:不是由systemd启动的外部进程

slice:进程组

snapshot:systemd快照

socket:进程间通信的套接字

swap:swap文件

timer:定时器

以上每种类型的文件都为一个unit,正式这些unit才组成了系统的各个资源(各个服务,各个设备等)。



unit相关的命令

systemctl list-units             列出正在运行(active)的unit

systemctl list-units --all      列出所有unit(包括失败的或者inactive的)

systemctl list-units --all --state=inactive 列出inactive的unit

systemctl list-units --type=service         列出状态为active的service

systemctl is-active crond.service          查看某个unit服务是否为active



5. target介绍

target类似于centos6的启动级别,但target内又支持多个target同时启动,target其实是多个unit的组合。启动target就是启动多个unit,用target来管理这些unit。


查看当前系统所有的target

# systemctl list-unit-files --type=target

UNIT FILE                 STATE   

basic.target              static  

bluetooth.target          static  

cryptsetup-pre.target     static  

cryptsetup.target         static  

ctrl-alt-del.target       disabled

default.target            enabled 

emergency.target          static  

final.target              static  

getty.target              static  

graphical.target          static  

halt.target               disabled

hibernate.target          static  

hybrid-sleep.target       static  

initrd-fs.target          static  

initrd-root-fs.target     static  

initrd-switch-root.target static  

initrd.target             static  

iprutils.target           disabled

kexec.target              disabled

local-fs-pre.target       static  

local-fs.target           static  

machines.target           disabled

multi-user.target         enabled 

network-online.target     static  

network-pre.target        static  

network.target            static  

...省略

查看指定target下面有哪些unit


# systemctl list-dependencies multi-user.target

multi-user.target

● ├─auditd.service

● ├─brandbot.path

● ├─chronyd.service

● ├─crond.service

● ├─dbus.service

● ├─irqbalance.service

● ├─kdump.service

● ├─network.service

● ├─NetworkManager.service

● ├─plymouth-quit-wait.service

● ├─plymouth-quit.service

● ├─postfix.service

● ├─rsyslog.service

● ├─sshd.service

● ├─sysstat.service

● ├─systemd-ask-password-wall.path

● ├─systemd-logind.service

● ├─systemd-readahead-collect.service

● ├─systemd-readahead-replay.service

● ├─systemd-update-utmp-runlevel.service

● ├─systemd-user-sessions.service

● ├─tuned.service

● ├─vmtoolsd.service

● ├─basic.target

● │ ├─firewalld.service

● │ ├─microcode.service

...省略

查看系统默认的target


# systemctl get-default

multi-user.target

设置默认的target

# systemctl set-default multi-user.target

Removed symlink /etc/systemd/system/default.target.

Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.


运行级别上面提到的multi-user.target等同于centos6的运行级别3。其实还有其他几个target对应0-6运行级别,如下所示:cron计划任务、chkconfig工具、systemd管理服务、unit、target介绍_计划任务service、unit以及target之间的联系

一个service属于一种unit;

多个unit一起组成了一个target;

一个target里面包含了多个service,你可以查看/usr/lib/systemd/system/sshd.service里面【install】部分的内容,它就定义了该service属于哪一个target。
# cat /usr/lib/systemd/system/sshd.service[Unit]Description=OpenSSH server daemonDocumentation=man:sshd(8) man:sshd_config(5)After=network.target sshd-keygen.serviceWants=sshd-keygen.service[Service]Type=forkingPIDFile=/var/run/sshd.pidEnvironmentFile=/etc/sysconfig/sshdExecStart=/usr/sbin/sshd$OPTIONSExecReload=/bin/kill -HUP$MAINPIDKillMode=processRestart=on-failureRestartSec=42s[Install]WantedBy=multi-user.target