文章目录
一. 前言
1. 相关文章
- Linux定时任务 (本文)
2. 说明
- 本文以定时任务删除tomcat, 删除nginx, 以及删除gitlab临时文件的例子(可拷贝即用)介绍Linux定时任务的使用
二. 定时任务使用案例
1. 定时切割和删除tomcat的catalina.out文件
定时任务在凌晨0点执行, 按天切割catalina.out文件, 删除15天前的文件
- 步骤1: 创建定时任务执行的脚本并设置写权限
mkdir /usr/local/myjob
touch /usr/local/myjob/clear-catalina-out-15-days.sh
chmod +x /usr/local/myjob/clear-catalina-out-15-days.sh
- 步骤2: 进入脚本编辑
vim /usr/local/myjob/clear-catalina-out-15-days.sh
- 步骤3: 脚本写入内容如下(点击i进入编辑, 点击esc按钮退出编辑, 输入:wq保存并退出)
#!/bin/bash
#定义当前日期
#date_0=`date +%Y%m%d`
date_0=`date -d'1 day ago' +%Y%m%d`
#定义15天前的日期
date_15=`date -d'15 day ago' +%Y%m%d`
#写上tomcat的日志绝对路径 (填写自己的tomcat日志地址)
putdata_log_path=/usr/service/tomcat8087/logs
#跳转到tomcat日志文件夹,复制catalina.out到catalina.out.${d}.log
cd ${putdata_log_path} && cp catalina.out catalina.out.${date_0}
#清空cat文件catalina.out
echo "===cut line===" > ${putdata_log_path}/catalina.out
#删除15天前的文件, 即catalina.out.${d15}.log
rm -rf ${putdata_log_path}/catalina.out.${date_15}
#删除其他日志(根据自己需要看是否要删除以下这些日志, 这些日志按日存储无需切割)
new_date_15=`date -d'15 day ago' +%Y-%m-%d`
rm -rf ${putdata_log_path}/catalina.${new_date_15}.log
rm -rf ${putdata_log_path}/localhost.${new_date_15}.log
rm -rf ${putdata_log_path}/localhost_access_log.${new_date_15}.txt
rm -rf ${putdata_log_path}/host-manager.${new_date_15}.log
rm -rf ${putdata_log_path}/manager.${new_date_15}.log
- 步骤4: 配置定时任务 (配置前可以先查看下已有的定时任务, 命令crontab -l)
crontab -e
- 步骤5: 添加以下内容,并保存(:wq)
0 0 * * * /usr/local/myjob/clear-catalina-out-15-days.sh
- 步骤6: 重启定时任务(服务名不正确时使用systemctl list-units --type=service 查看所有服务名称. 名称可能为cron)
service crond restart
2. 定时切割和删除nginx的access.log文件
定时任务在凌晨0点执行, 按天切割access.log文件, 删除30天前的文件
- 步骤1: 创建定时任务执行的脚本并设置写权限
mkdir /usr/local/myjob
touch /usr/local/myjob/clear-nginx-access-log-30-days.sh
chmod +x /usr/local/myjob/clear-nginx-access-log-30-days.sh
# 添加记录定时任务执行的日志文件
touch /usr/local/myjob/job.log
chmod +x /usr/local/myjob/job.log
- 步骤2: 创建切割后文件存储的文件夹
mkdir /usr/local/nginx/logs/access
- 步骤3: 进入脚本编辑
vim /usr/local/myjob/clear-nginx-access-log-30-days.sh
- 步骤4: 脚本写入内容如下(点击i进入编辑, 点击esc按钮退出编辑, 输入:wq保存并退出)
#!/bin/bash
echo "Execution clear-nginx-access-log started at $(date)" >> /usr/local/myjob/job.log
#定义当前日期
#date_0=`date +%Y%m%d`
date_0=`date -d'1 day ago' +%Y%m%d`
#定义30天前的日期
date_30=`date -d'30 day ago' +%Y%m%d`
#写上nginx的logs日志绝对路径
putdata_log_path=/usr/local/nginx/logs
#跳转到文件夹,复制access.log到access.${d}.log
cd ${putdata_log_path} && cp access.log ${putdata_log_path}/access/access.${date_0}.log
#清空access.log文件
echo "===cut line===" > ${putdata_log_path}/access.log
#删除30天前的日志
rm -rf ${putdata_log_path}/access/access.${date_30}.log
echo "Execution clear-nginx-access-log ended at $(date)" >> /usr/local/myjob/job.log
- 步骤5: 配置定时任务 (配置前可以先查看下已有的定时任务, 命令crontab -l)
crontab -e
- 步骤6: 添加以下内容,并保存(:wq)
0 0 * * * /usr/local/myjob/clear-nginx-access-log-30-days.sh
- 步骤7: 重启定时任务 (服务名不正确时使用systemctl list-units --type=service 查看所有服务名称. 名称可能为cron)
service crond restart
3. 定时删除gitlab的tmp_pack_*临时文件
gitlab在gc时可能无法删除一下很大的临时文件(几个G以上), 暂无法解决该问题. 这里配置一个12点30分执行的定时任务去删除指定项目的临时文件 (因为我这里的临时文件是在12点11分生成的)
拓展: gitlab项目存储路径说明
- 步骤1: 创建定时任务执行的脚本并设置写权限
mkdir /usr/local/myjob
touch /usr/local/myjob/clear-gitlab-temp-file.sh
chmod +x /usr/local/myjob/clear-gitlab-temp-file.sh
#添加存储定时任务执行记录的日志文件
touch /usr/local/myjob/job.log
chmod +x /usr/local/myjob/job.log
- 步骤2: 进入脚本编辑
vim /usr/local/myjob/clear-gitlab-temp-file.sh
- 步骤3: 脚本写入内容如下(点击i进入编辑, 点击esc按钮退出编辑, 输入:wq保存并退出)
#!/bin/bash
echo "Execution clear-gitlab-temp-file started at $(date)" >> /usr/local/myjob/job.log
#删除指定路径下的临时文件 (需先确认要删除项目的临时文件路径)
rm -rf /var/opt/gitlab/git-data/repositories/@hashed/81/17/811786ad1ae74adfdd20dd0372abaaebc6246e343aebd01da0bfc4c02bf0106c.git/objects/pack/tmp_pack_*
echo "Execution clear-gitlab-temp-file ended at $(date)" >> /usr/local/myjob/job.log
4.配置定时器 (若第一次执行, 会让你选择编译器, 一般都是使用/usr/bin/vim.basic)
crontab -e
5.添加以下内容,并保存(:wq)
30 12 * * * /usr/local/myjob/clear-gitlab-temp-file.sh
6.重启定时任务
service crond restart
- 步骤4: 配置定时任务 (配置前可以先查看下已有的定时任务, 命令crontab -l)
crontab -e
- 步骤5: 添加以下内容,并保存(:wq)
30 12 * * * /usr/local/myjob/clear-gitlab-temp-file.sh
- 步骤6: 重启定时任务 (服务名不正确时使用systemctl list-units --type=service 查看所有服务名称. 名称可能为cron)
service crond restart
三. 拓展
1. 表达式
定时任务表达式为5位. 例如30 12 * * *
30 12 * * *
| | | | |
分 时 天 月 星期
分: 一小时当中的第几分钟. 取值范围: 0~59
时: 一天当中的第几小时. 取值范围: 0~23
天: 一个月当中的第几天. 取值范围: 1~31
月: 一年当中的第几月. 取值范围: 1~12
星期: 一周当中的星期几. 取值范围: 0~7 (0和7都代表星期日)
示例:
- 每1分钟执行: */1 * * * * 或者 * * * * *
- 每5分钟执行: */5 * * * *
- 每天上午9点10分执行:10 9 * * *
2. 选择编译器
第一次使用crontab时会跳出如下命令行, 意思是让你选择你想要的编译器. (作为java开发为主的程序员, 我当然是选择/usr/bin/vim.basic啦)
这里我选择3即可. (忘记截图了, 这个网上随便找的图)
若选错了编译器, 可以简单粗暴直接临时切换并开始编辑: (切换后之后也会变成这个编译器)
export EDITOR=“/usr/bin/vim.basic”;crontab -e
3. gitlab项目存储路径说明
示例项目在gitlab存储路径:
/var/opt/gitlab/git-data/repositories/@hashed/81/17/811786ad1ae74adfdd20dd0372abaaebc6246e343aebd01da0bfc4c02bf0106c.git/objects/pack
其中811786ad1ae74adfdd20dd0372abaaebc6246e343aebd01da0bfc4c02bf0106c为project ID的hash值, project ID如下图所示
@hashed后面的81来自于hash值前两位,
@hashed后面的17来自于hash值的第三位和第四位
项目代码的存储路径在.git的/objects/pack下
下面提供一下查询项目hash值的java代码
import java.security.MessageDigest;
import java.util.Map;
import java.util.TreeMap;
public class Sha256Example {
public static void main(String[] args) {
String projectIds = "45";
Map<String, String> hashToProjectIdMap = new TreeMap<>();
for (String projectId : projectIds.split(",")) {
String hash = getProjectIdSHA256Hash(Integer.parseInt(projectId));
hashToProjectIdMap.put(hash, projectId);
}
for (Map.Entry<String, String> entry : hashToProjectIdMap.entrySet()) {
System.out.println(entry.getKey().substring(0, 2) + " -> " + entry.getKey().substring(2, 4) + " -> "
+ entry.getKey() + " -> 项目id:" + entry.getValue());
}
}
public static String getProjectIdSHA256Hash(int projectId){
try {
// 创建一个MessageDigest实例来计算SHA-256哈希
MessageDigest digest = MessageDigest.getInstance("SHA-256");
// 使用digest()方法处理输入字符串
byte[] hashBytes = digest.digest(String.valueOf(projectId).getBytes("UTF-8"));
// 将字节转换为十六进制字符串
StringBuilder hashString = new StringBuilder();
for (byte b : hashBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hashString.append('0');
}
hashString.append(hex);
}
return hashString.toString();
} catch (Exception e) {
throw new RuntimeException("获取hash值失败, projectId=" + projectId);
}
}
}
执行结果:
四. 思考
- 暂无