Linux定时任务

一. 前言

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 (07都代表星期日)

示例:

  • 每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);
        }
    }
}

执行结果:
在这里插入图片描述

四. 思考

  • 暂无

五. 参考文档

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值