Linux
Linux
df
Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计
df [选项]... [FILE]...
-h
(--human-readable
):人类可读选项。此标志以更容易阅读的格式打印大小,如 KB、MB、GB 等运行
df -h
时,输出通常包含有关每个已挂载文件系统的信息,包括总大小、已用空间、可用空间和利用率等详细信息。例如,输出可能类似于以下内容:Filesystem Size Used Avail Use% Mounted on /dev/sda1 20G 10G 8.1G 55% / /dev/sdb1 50G 25G 22G 54% /home
Filesystem:文件系统的名称
Size:文件系统的总大小
Used:已使用的空间量
Avail:可用空间
Use%:已使用空间的百分比
Mounted on:文件系统的挂载点
crontab
在 Linux 中,可以使用 crontab
命令来创建定时任务。具体步骤如下:
编辑 crontab 文件
使用 crontab -e 命令打开当前用户的 crontab 文件,如果是第一次创建定时任务,系统会要求选择一个编辑器,可以选择自己熟悉的编辑器进行编辑
编写定时任务
当使用
crontab
命令来编写定时任务时,需要使用特定的时间表达式来指定任务应该在何时运行。时间表达式的格式如下:* * * * * command to be executed - - - - - | | | | | | | | | +----- Day of the week (0 - 6) (Sunday = 0) | | | +------- Month (1 - 12) | | +--------- Day of the month (1 - 31) | +----------- Hour (0 - 23) +------------- Minute (0 - 59)
这个表达式可以理解为五个时间字段和一个指令字段组成,每个时间字段都代表时间的不同部分,而指令字段则是要执行的命令或脚本
时间字段的意义如下:
分钟(0-59):表示分钟数,例如 0-59 表示每分钟都要执行一次
小时(0-23):表示小时数,例如 0-23 表示每小时都要执行一次
日(1-31):表示日期数,例如 1-31 表示每月的 1 日到 31 日都要执行一次
月(1-12):表示月份,例如 1-12 表示每月都要执行一次
星期(0-6):表示星期几,例如 0-6 表示每周的周日到周六都要执行一次
其中,星号 (*) 表示任意值,可以匹配所有可能的值。每个表达式中的各个部分(分钟、小时、日期等)所能接受的值可以是单个数值、一个数值区间,或者一个数值列表
举个例子,对于分钟的部分,可以设置为:
5:表示只在第 5 分钟执行
0-10:表示在 0 到 10 分钟内的每一分钟执行
0,15,30,45:表示在 0、15、30 和 45 分钟执行
同样的,对于小时、日期等部分,都可以采用这种方式来设置取值范围
举例:
* * * * * command
表示每分钟执行一次命令0 * * * * command
表示每小时的第 0 分钟执行一次命令0 0 * * * command
表示每天的 0 点 0 分钟执行一次命令0 0 * * 1 command
表示每周一的 0 点 0 分钟执行一次命令需要注意的是,这些时间字段中都可以使用逗号、星号、连字符和正斜杠等符号来组合表达式。
比如,如果想要每隔 10 分钟执行一次命令,可以使用 */10 * * * * 表示,其中的 */10 表示每隔 10 分钟执行一次
又比如,如果想要在周一和周三的晚上 10 点执行命令,可以使用 0 22 * * 1,3 表示,其中的 1,3 表示周一和周三,而 0 22 表示晚上 10 点
crontab 的配置是基于 UTC 时间的,而非本地时间。因此,如果需要根据本地时间来执行定时任务,需要手动在命令中指定时区。例如:
0 0 * * * TZ=Asia/Shanghai command
表示每天 0 点 0 分钟按照上海时区执行一次命令
示例:
使用 crontab -l
命令列出当前的定时任务列表。执行该命令后,系统会显示当前用户的所有定时任务,每个任务一行,以及相应的执行时间和执行命令等信息
crontab -l
0 4 1 * * sh /data/deploy/shell/del_log_files_180days.sh
通过执行 crontab -l
命令我们看到系统在每月 1 日的凌晨 4 点会执行一个 Shell 脚本,我们来看下这是一个什么样的脚本:
#!/bin/bash
################################
# File Name:
# Description:
#################################
log_path="/usr/local/nginx/logs"
path_list=($log_path)
for item in ${path_list[@]}
do
#目录存在,删除修改时间为 180 天前的文件
if [ -d "$item" ]; then
echo "Start deleting logs that are 180 days old in $item"
find "$item"/* -name 'access_*.log' -mtime +180 -exec rm -rf {} \;
echo "End deleting logs in $item"
fi
done
exit;
这段 Shell 脚本是一个日志文件清理的脚本。下面对每个部分的作用进行解释:
#!/bin/bash
表示使用的解释器是 Bashlog_path="/usr/local/nginx/logs"
定义变量 log_path,值为 /usr/local/nginx/logs,表示需要清理的日志文件所在的目录路径path_list=($log_path)
将路径添加到一个数组中,后续会用到for item in ${path_list[@]}
表示遍历路径数组中的每个元素,${path_list[@]}
表示数组中的所有元素if [ -d "$item" ]; then
表示判断当前目录是否存在,如果存在则继续执行删除操作echo "Start deleting logs that are 180 days old in $item"
表示输出当前目录,提示开始删除该目录下的日志文件find "$item"/* -name 'access_*.log' -mtime +180 -exec rm -rf {} \;
表示查找该目录下所有 access_*.log 文件,且修改时间超过 180 天的文件,-exec
选项则用于在找到的文件上执行指定的命令,然后执行rm
命令删除这些文件,{} 表示匹配到的文件名。在-exec
选项中需要使用分号来表示命令的结束,所以需要用反斜杠转义分号,使其在命令中被解释为普通字符而不是命令分隔符echo "End deleting logs in $item"
表示输出当前目录,提示已经删除该目录下的日志文件fi
表示 if 语句的结束done
表示 for 循环的结束exit
表示脚本执行结束
定时清空日志可以释放磁盘空间,避免日志过多导致磁盘空间不足,从而导致服务器崩溃或无法正常运行