进程管理
- 进程(process):程序被触发后,执行者的权限与属性、程序代码与所需数据等都会被载入内存中,操作系统并给予这个内存内的单元一个识别码(PID),可以说,进程就是一个正在运行中的程序。
- 子进程与父进程:进程的PPID即是父进程的PID,子进程由fork and exec流程产生的。Linux 系统所有进程的父进程就是 init 这个 PID 为 1 号的进程。
- 服务(daemon):常驻在内存当中的程序通常都是负责一些系统所提供的功能以服务使用者各项任务。
工作管理
工作管理(job control)是用在 bash 环境下的,在登录系统取得bash shell后,在单一终端机同时进行多个工作的行为管理。
- 只管理自己的 bash:这些工作所触发的程序必须来自于你 shell 的子程序,即使你是 root 也不能够将别人的 bash 下面的 job 给他拿过来执行;
- 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);
- 背景:可以自行运行的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 调用该工作;
- 背景中“执行”的程序不能等待 terminal/shell 的输入(input)。
相关命令
- & :直接将指令丢到背景中执行
- [Ctrl]-Z :将目前的工作丢到背景并暂停
- jobs :查看目前的背景工作及状态。选项 -l 列出PID,-r 仅列出run的工作,-s 仅列出暂停的工作
- fg :将背景工作拿到前景来处理。参数 %N N为工作号码,%是可省略的
- bg :将背景中暂停的工作变为运行中
- kill :直接移除背景工作。选项 -signal %jobnumber -1 重载 -9 立即强制删除 -15 正常的程序方式终止工作
- nohup :背景工作会随着终端关闭而中断,如果希望任务在系统中继续执行不受登录或离线影响,可以使用 at 或此 nohup
# 使用 & 将指令丢到背景
tar -zpcvf /tmp/etc.tar.gz /etc &
# 同时将执行结果输出到指定文件
tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
# 查看背景工作,+ 为最近被放到背景的工作,- 最近第二个被放的工作
jobs -l
# 调取最近一个背景工作到前景
fg
# 根据工作号调取背景工作
fg %2
# 利用 ctrl-Z 将当前工作丢到背景,此时工作是暂停的
# 使用 bg 命令可将此工作改为运行中
bg %3
# 移除工作
kill -9 %2
# nohup 命令执行不受终端退出影响,再次登录时通过ps查询,不能用jobs查看
# nohup 默认输出到当前目录的 nohup.out 文件
nohup ./sleep.sh &
# 指定输出到特定文件
nohup ./sleep.sh > ./sleep.log 2>&1 &
进程管理
相关命令
- ps :将某个时间点的进程运行情况截取下来
- top :动态查看进程变化。选项 -d 后接更新秒数 默认5秒,-b 批次方式执行,-n 与-b搭配 需要几次top输出,-p 指定某些PID来查看。以下在top执行中使用的按键操作:
- ? :显示在top中可以输入的按键指令
- P :以CPU的使用资源排序显示
- M :以内存Memory使用资源排序显示
- N :以PID排序
- T :由该进程使用的CPU时间累积排序
- k :给予某个PID一个讯号 signal
- r :给予某个PID重新制定一个nice值
- q :退出top
- pstree :进程树,选项 -p 显示PID,-u 显示所属账号
- kill :重启或关闭进程,-signal PID,信号一般用 1 9 15
- killall :与kill类似,-signal 指令名称,选项 -i 交互提示,-e 后接command name 要一致(不能超过15个字符),-I 指令名称忽略大小写
- free :查看内存使用情况,选项 -h 显示单位 h 为系统自行显示 其他还有b(Bytes) m(MBytes) k(KBytes) g(GBytes),-s 几秒输出一次 持续输出,-c 输出几次 与-s一起使用
- uname :查看系统与核心信息,选项 -a 列出系统所有信息
- uptime :查看系统启动时间与工作负载,输出信息与top命令的第一行数据一样
- netstat :查看网络连接,选项 -a 列出系统所有连接,-t 列出tcp网络连接,-u 列出udp网络连接,-n 以端口号显示,-l 列出正在网络监听中的服务,-p 列出PID
- dmesg :查看系统核心产生的信息,系统从开机到当前产生的所有信息都记录在内存里,通过此命令方便查看分析
- vmstat :监测系统资源变化,选项 -fs 内存相关,-S 单位(K/M)
ps 返回结果中状态(STAT)有哪些:
- R(Running):该程序正在运行中;
- S(Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
- D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
- T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
- Z(Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
top 返回结果说明:
- 第一行信息
- 目前的时间:如 00:53:59
- 已开机时间:开机到目前为止所经过的时间,如 up 6:07
- 登录人数:已经登陆系统的使用者人数,如 3 users
- 平均工作负载:系统在 1, 5, 15 分钟,平均要负责运行几个进程。越小代表系统越闲置,若高于 1 系统程序可能过于繁忙
- 第二行信息 Tasks:显示进程总量及个别状态。注意最后的 zombie 表示僵尸进程数
- 第三行信息 %Cpus:显示CPU的整体负载,wa 表示I/O wait等待时间,多核CPU可以按“1”键切换查看
- 第四行与第五行信息:表示实体内存(Mem)与虚拟内存(Swap)的使用情况。注意swap被用的很多,表示实体内存不足,性能降低严重
- 第六行信息:每个进程使用的资源情况
- PID:每个进程的PID
- USER:该进程的所有者
- PR:进程执行优先顺序,越小越早执行
- NI:Nice值,与PR有关,越小越早执行
- %CPU:CPU 的使用率
- %MEM:内存的使用率
- TIME+:CPU 使用时间的累加
netstat 返回结果说明:
- Proto :网络的封包协定,主要分为 TCP 与 UDP 封包
- Recv-Q:非由使用者程序链接到此 socket 的复制的总 Bytes 数
- Send-Q:非由远端主机传送过来的 acknowledged 总 Bytes 数
- Local Address :本地端的 IP:port 情况
- Foreign Address:远端主机的 IP:port 情况
- State :连线状态,主要有创建(ESTABLISED)及监听(LISTEN)
vmstat 返回结果说明:
- 程序字段 (procs) 的项目分别为: r :等待运行中的程序数量;b:不可被唤醒的程序数量。这两个项目越多,代表系统越忙碌 (因为系统太忙,所以很多程序就无法被执行或一直在等待而无法被唤醒之故)
- 内存字段 (memory) 项目分别为: swpd:虚拟内存被使用的容量; free:未被使用的内存容量; buff:用于缓冲内存;cache:用于高速缓存内存。 这部份则与 free 是相同的。
- 内存交换空间 (swap) 的项目分别为: si:由磁盘中将程序取出的量; so:由于内存不足而将没用到的程序写入到磁盘的 swap的容量。 如果 si/so 的数值太大,表示内存内的数据常常得在磁盘与内存之间传来传去,系统性能会很差!
- 磁盘读写 (io) 的项目分别为: bi:由磁盘读入的区块数量; bo:写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常忙碌!
- 系统 (system) 的项目分别为: in:每秒被中断的程序次数; cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与周边设备的沟通非常频繁! 这些周边设备当然包括磁盘、网卡、时间钟等。
- CPU 的项目分别为: us:非核心层的 CPU 使用状态; sy:核心层所使用的 CPU 状态; id:闲置的状态; wa:等待 I/O 所耗费的 CPU 状态; st:被虚拟机 (virtualmachine) 所盗用的 CPU 使用状态 。
# 查看系统所有的进程
ps aux
ps aux | grep php
ps -lA
# 连同部分进程树状态
ps axjf
# 仅查看自己bash相关进程
ps -l
# 动态查看进程情况
top
# 修改top的刷新时间,并查看特定PID
top -d 2 -p 14836
# top 执行固定次数,并输出
top -b -n 2 > /tmp/top.log
# 查看进程树
pstree -pu
# 强制关闭进程
kill -9 $(ps aux | grep 'rsyslogd' | grep -v 'grep' | awk '{print $2}')
# 根据指令名称关闭进程
killall -i -9 bash
# 查看内存,间隔3秒 输出5次
free -h -s 3 -c 5
# 查看系统信息
uname -a
# 查看系统启动时间与工作负载
uptime
# 查看系统所有监听中的网络连接、端口及PID
netstat -tulnp
# 查看系统核心产生的信息
dmesg | less
# 监测资源使用,每3秒一次,共10次
vmstat -S M 3 10
# 持续监测
vmstat 3
系统服务
系统服务(daemon),也叫守护进程,是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
systemd 配置及分类
systemd 将 daemon 执行脚本称为一个服务单位(unit),每种 unit 依据功能分类为不同的类型(type)。
systemd 配置目录及文件
- /usr/lib/systemd/system/ :每个服务最主要的启动脚本设置。
- /run/systemd/system/ :系统执行过程中所产生的服务脚本,优先序要比/usr/lib/systemd/system/ 高!
- /etc/systemd/system/ :管理员创建的执行脚本,执行优先序又比 /run/systemd/system/ 高!系统根据 /etc/systemd/system/ 决定开机时执行的脚本,此目录有很多链接文件,实际执行脚本是放在 /usr/lib/systemd/system/。因此想要修改某个服务启动配置,应去 /usr/lib/systemd/system/ 目录内修改。
systemd 的 unit 分类
通过查看脚本扩展名区分配置目录内的服务类型。常见的unit类型:
- .service :一般服务类型(service unit),常见类型。
- .socket :内部程序数据交换的插槽服务(socket unit),主要是 IPC(Inter-process communication)的传输讯息插槽档(socket file)功能。
- .target :执行环境类型(target unit),其实是一群 unit 集合。
- .mount/.automount :文件系统挂载相关的服务(automount unit / mount unit)。
- .path :监测特定文件或目录类型(path unit),某些服务需要监测特定目录来提供服务,如打印服务。
- .timer :循环执行的服务(timer unit),类似定时任务,不过是由systemd主动提供的。
systemctl 管理服务
通过 systemctl 管理单一服务(service unit)的启动、停止、重启、状态及开机自启。
systemctl [command] [unit]
command 主要有:
- start :启动服务
- stop :停止服务
- restart :重启服务
- reload :重载服务
- enable :激活开机自启
- disable :禁用开机自启
- status :查看服务状态,以确认是否正在执行、开启自启、登录等信息。服务 Active 常见状态:
- active(running):正有一只或多只程序正在系统中执行。
- active(exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。
- active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。
- inactive :这个服务目前没有运行。
通过 systemctl 查看系统所有服务
- list-units :列出已启动的 unit,选项 –all 列出全部,–type=TYPE 指定unit类型(如 service、target)
- list-unit-files :列出unit文件列表
通过 systemctl 管理不同的操作环境(target unit)
- get-default :查看当前的 target
- set-default :后接target,设置默认操作模式
- isolate :切换到后接的模式
通过 systemctl 分析各服务之间的相依性
systemctl list-dependencies [unit] [–reverse]
- –reverse :反向追踪谁使用这个 unit
# 查看atd服务状态
# 返回结果重点第二、三行,Loaded中说明是否开启自启(enabled 开机自启,disable 不自启),Active说明服务是否正在执行
systemctl status atd.service
# 关闭服务
systemctl stop atd.service
# 查看已启动服务或所有服务
systemctl
systemctl list-units --all
systemctl list-units --type=serivice --all
systemctl list-unit-types
systemctl list-units --all | grep php
# 将默认的Ubuntu图形界面切换到文字界面
# 返回 graphical.target,说明当前是图形界面
systemctl get-default
# 设置默认模式为multi-user.target
sytemctl set-default multi-user.target
# 在不重启情况下,将操作环境改为文字界面
sudo systemctl isolate multi-user.target
# 重新改为图形界面
sudo systemctl isolate graphical.target
# systemd 简单指令
# 系统关机
systemctl poweroff
# 重启
systemctl reboot
# 进入暂停模式
systemctl suspend
# 进入休眠模式
systemctl hibernate
# 强制进入救援模式
systemctl rescue
# 强制进入紧急救援模式
systemctl emergency
# 列出目前target环境下(get-default),服务依赖
systemctl list-dependencies
# 列出某个target或服务的服务依赖
systemctl list-dependencies graphical.target
# 某个服务被谁依赖
systemctl list-dependencies --reverse
制作 service 配置文件
systemctl 针对service类型的配置文件,整体分为三个部分:
- [Unit] :unit说明,依赖其他daemon进程
- Description :描述,使用 systemctl list-units 等命令可以看到介绍
- Documentation :详细说明文档
- After :说明此 unit 是在哪个 daemon 启动之后才启动。仅时启动顺序,并不强制要求此服务一定要启动后才启动unit
- Before :与 After 相反
- Requires :明确要求需要在哪个 daemon 启动后才能启动。
- Wants :与 Requires 相反,规范的是这个 unit 之后最好还要启动什么服务。并不强制
- Conflicts :冲突服务,即这个项目后面接的服务如果有启动,那么我们这个 unit 本身就不能启动。
- [Service] :unit类型,其他还有[Socket], [Timer], [Mount], [Path]..
- Type :启动方式,一般有几种类型 simple(默认)、forking、dbus、oneshot等
- EnvironmentFile :指定启动脚本的环境配置文件
- ExecStart :实际执行此 daemon 的指令或脚本程序。指令串仅接受“指令 参数 参数…”的格式,不能有特殊字符(很多bash语法也不支持)。
- ExecStop :与 systemctl stop 的执行有关,关闭此服务时所进行的指令。
- ExecReload :与 systemctl reload 有关的指令行为
- Restart :当设置 Restart=1 时,则当此 daemon 服务终止后,会再次的启动此服务。
- RemainAfterExit :当设置为 RemainAfterExit=1 时,则当这个 daemon 所属的所有程序都终止之后,此服务会再尝试启动。
- TimeoutSec :若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利“正常启动或正常结束”的情况下,则我们要等多久才进入“强制结束”的状态!
- KillMode :可以是 process, control-group, none 的其中一种,如果是 process则 daemon 终止时,只会终止主要的程序 (ExecStart 接的后面那串指令),如果是 control-group 时, 则由此 daemon 所产生的其他control-group 的程序,也都会被关闭。如果是 none 的话,则没有程序会被关闭喔!
- RestartSec :与 Restart 有点相关性,如果这个服务被关闭,然后需要重新启动时,大概要 sleep 多少时间再重新启动的意思。默认是 100ms (毫秒)。
- [Install] :将此 unit 安装到哪个 target 里面
- WantedBy :将这个unit安装在哪个target里,一般是 multi-user.target
- Also :当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable。有依存性的服务写这里
- Alias :链接别名。
制作服务demo
制作一个备份服务的demo:
创建脚本 vim /root/bin/backup.sh
#!/bin/bash
source='/etc'
target="/backups/test-backup-$(date +%Y-%m-%d).tar.gz"
[ ! -d /backups ] && mkdir /backups
tar -zcvf ${target} ${source} &> /backups/backups.log
创建服务 /etc/systemd/system/backup.service
[Unit]
Description=backup test
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /root/bin/backup.sh | at now"
[Install]
WantedBy=multi-user.target
# 重载daemon
systemctl daemon-reload
# 启动自制备份服务
systemctl start backup.service
制作 timer 配置文件
systemd.timer 可以实现类似 crond 定时任务的功能,相对优势:
- debug方便:systemd 服务产生信息都会记录日志
- timer 可以与 systemd 的服务相结合
- 限制资源利用:timer 可以与 control group 结合
- 精度更高:crond 任务最小执行单位是 分钟,timer可以到秒、毫秒
实现 timer 的几个条件或步骤:
- 系统的 timer.target 一定要启动
- 存在 sname.service 服务(sname 是你自己指定的名称),相当于需要有自制服务
- 存在 sname.timer 时间启动服务(sname 与上面的服务名称一致),自制的时间服务
timer 设置值
制作 sname.timer 与制作service类似,需要创建一个 *.timer 文件。其中的[Timer]配置部分如下:
- OnActiveSec :当 timers.target 启动多久之后才执行这只 unit
- 间隔时间单位:us 微秒,ms 毫秒,s 秒,m 分钟,h 小时,d 天,w 周,month 月,y 年
- OnBootSec :当开机完成后多久之后才执行
- OnStartupSec :当 systemd 第一次启动之后过多久才执行
- OnUnitActiveSec :这个 timer 配置文件所管理的那个 unit 服务在最后一次启动后,隔多久后再执行一次
- OnUnitInactiveSec :这个 timer 配置文件所管理的那个 unit 服务在最后一次停止后,隔多久再执行一次
- OnCalendar :使用实际时间 (非循环时间) 的方式来启动服务
- 时间格式语法:英文周名 YYYY-MM-DD HH\:MM\:SS,如Thu 2015-08-13 13:40:00
- 一些demo:每小时 — :00:00,每天2点 — 02:00:00,每周日5点 Sun — 05:00:00,每月2号6点 –02 06:00:00
- Unit :指定某个service unit,一般不需要设置,仅在 sname.server + sname.timer 不同名时
- Persistent :当使用 OnCalendar 的设置时,指定该功能要不要持续进行。一般设置为 yes
timer demo1
备份任务开机后2小时执行一次,之后每两天执行一次。
创建timer vim /etc/systemd/system/backup.timer
[Unit]
Description=backup my server timer
[Timer]
OnBootSec=2h
OnUnitActiveSec=2d
[Install]
WantedBy=multi-user.target
# 重载daemon
systemctl daemon-reload
# 开机自启
systemctl enable backup.timer
# 重启
systemctl restart backup.timer
# 查看backup.service 上次执行时间
systemctl show backup.service | grep ExecMainExitTimestamp
# 查看backup.timer 下次执行时间
systemctl show backup.timer | grep NextElapseUSecMonotonic
timer demo2
备份任务每个星期天2点执行一次
创建timer vim /etc/systemd/system/backup2.timer
[Unit]
Description=backup my server timer2
[Timer]
OnCalendar=Sun *-*-* 02:00:00
Persistent=true
Unit=backup.service
[Install]
WantedBy=multi-user.target
工作调度
Linux 工作调度分为两种:
- 一次性工作调度:仅执行一次就结束调度。使用
at
指令,需要有 atd 服务(一般发行版默认没启动)。 - 例行性工作调度:周期性的每隔一段时间执行一次。使用
crontab
指令,需要 crond 服务(默认已启动)。
一次性任务 at
启动 atd
系统并非默认启动atd,需要手动启动。
# 重启atd,有些可能需要安装
systemctl restart atd
systemctl enable atd
systemctl status atd
处于安全考虑,不是所有用户都能执行at调度,有两个配置文件做了限制:
- /etc/at.allow :写在此文件的用户才能使用at
- /etc/at.deny :如果不存在 /etc/at.allow 文件,系统会查找此at.deny文件。写在此文件的用户不能使用at,其他用户可以使用。
- 如果以上两个文件都不存在,则仅 root 可以使用at指令。
at 命令
at [-mldv] TIME COMMAND
选项
- -m :at工作完成后邮件通知使用者
- -l :列出当前使用者的所有at调度,相当于 atq
- -d :取消一个 at 调度,相当于 atrm
- -v :显示较明显的时间格式
- -c :后接工作号,列出实际指令内容
参数 - TIME :时间格式,定义at 何时执行,格式有:
- HH:MM 今日某时某分执行,若当前已超过此时刻,则明日某时某刻执行
- HH:MM YYYY-MM-DD 指定某年月日时分执行
- HH\:MM[am|pm] [Month] [Date]
- HH\:MM[am|pm] + number [minutes|hours|days|weeks] 某个时刻再加几个时间,如 now + 5 minutes (五分钟后)
batch 命令
系统空闲时才执行背景任务。当CPU负载小于0.8时才执行任务,避免单一时间点CPU工作负载过大。
# 10分钟后执行备份
at now +10 minutes # 回车进入at shell环境,可以下达多个指令等待运行
at> /root/bin/backup.sh
at> [EOT] # 编写完指令后,ctrl + D 结束输入
# 查看增加的at任务
at -l
# 删除某个at
at -d 2
# 查看at的具体指令任务
at -c 2
# 空闲时执行
batch
例行性任务 crontab
循环执行的例行性工作调度则是由 cron(crond)这个系统服务来控制的。系统已默认启动该服务。
cron 的最低监测限制是“分钟”,也就是每分钟读取并执行一次任务调度。
与 at 相似,为了安全性,需要配置可以使用crontab的用户账号:
- /etc/cron.allow :此文件内账号可以使用 crontab
- /etc/cron.deny :若无/etc/cron.allow,则查询/etc/cron.deny。此文件用户不能使用crontab
- 以上文件都不存在,则仅root可以使用。
crontab 命令
crontab [-u username] [-l|-e|-r]
- -u :帮其他用户创建/移除 crontab,仅root有此权限
- -e :编辑 crontab 工作内容
- -l :查阅当前用户的 crontab 工作内容
- -r :移除所有 crontab 工作内容,若仅移除部分,可以用 -e 编辑
时间设置
每项任务具有六个字段,分别含义:
- 分 :0-59
- 时 :0-23
- 日 :1-31
- 月 :1-12
- 周 :0-7,其中0或7都表示星期日
- 指令
特殊字符表达的时间:
- * :表示任何时刻都可以
- \, :逗号表示分隔时段。如
0 3,6 * * * command
(每天3点或6点执行任务) - – :减号表示一段时间范围内。如
20 8-12 * * * command
(每天8点到12点执行任务多次) - \/n :n表示数字,即是每隔 n 单位间隔。如
\*/5 * * * * command
(每5分钟执行一次)
# 编辑 crontab
crontab -e
# 示例
0 */1 * * * date >> /tmp/test_crontab
系统配置文件
crontab 是针对使用者的cron设计,系统的例行性任务有配置文件 /etc/crontab
管理。
此配置每行任务有7个字段(多一个身份)分别是:分 时 日 月 周 身份 指令
crond服务读取的配置文件位置:
- /etc/crontab
- /etc/cron.d/* :自己开发的软件或非系统软件,可以放到此目录
- /var/spool/cron/*
使用crontab还是配置文件的总结:
- 个人化的行为使用
crontab -e
:依据个人需求创建的例行工作调度,同时保障指令不被其他用户看到 - 系统维护管理使用
vim /etc/crontab
:系统的重要工作 - 自己开发软件使用
vim /etc/cron.d/newfile
:自己的软件建议创建一个新配置文件 - 固定每小时、每日、每周、每天执行的特别工作 :可以放到
/etc/crontab
或者放到 /etc/cron.hourly等几个目录里
执行停机时任务 anacron
以上 crontab 和 at,仅能在系统正常运行时执行。如果停机或其他故障时,有些任务错过就不会再执行。系统提供了 anacron 来解决此问题,让过期未执行的任务重新执行,避免一些重要任务因为故障停机导致忽略(如重要的备份等)。
anacron 是一个程序并不是服务,这个程序需要放到 crontab 的调度中,定期执行它。然后,它再去检查有无过期任务要执行。
anacron 语法
anacron [-sfnu] [job]
选项与参数
- s :依据记录时间判断执行各项任务
- f :强制执行,不判断记录时间
- n :立即执行任务,不延迟等待
- u :仅更新时间记录,不执行任务
- job :由
/etc/anacrontab
定义的各项工作名称
/etc/anacrontab 编写
每行记录有四个字段,分别含义:
- 天数 :anacron 执行当下与时间戳记(/var/spool/anacron/ 内的时间)相差的天数,若超过此天数,就准备开始执行,若没有超过此天数,则不予执行后续的指令
- 延迟时间 :若确定超过天数导致要执行调度工作了,那么请延迟执行的时间,因为担心立即启动会有其他资源冲突的问题
- 工作名称定义 :上面 anacron 的job来自此处
- 实际要进行的指令串
创建一个 anacrontab 大致流程
1.在/etc/anacrontab 中增加需要执行停机期间任务的crontab,vim /etc/anacrontab
# 示例
1 5 cron.daily run-parts --report /etc/cron.daily
2.将 anacrontab 加入到crontab,根据需要可以放到每小时或每日执行,如 vim /etc/cron.daily/0anacron
# 示例
#!/bin/sh
#
# anacron's cron script
#
# This script updates anacron time stamps. It is called through run-parts
# either by anacron itself or by cron.
#
# The script is called "0anacron" to assure that it will be executed
# _before_ all other scripts.
test -x /usr/sbin/anacron || exit 0
anacron -u cron.daily