当前位置: 首页 > article >正文

Linux 定时任务操作详解及python简单的任务管理器

Linux 定时任务操作

在 Linux 中,定时任务操作主要通过 cron 工具来实现。cron 是一个基于时间的作业调度器,允许用户在指定的时间或周期内执行预定的任务。

1. 查看当前用户的定时任务

使用 crontab 命令查看当前用户的定时任务:

crontab -l

2. 编辑定时任务

使用 crontab -e 命令编辑当前用户的定时任务。此命令将打开一个编辑器(通常是 vi 或 nano),允许你添加、删除或修改任务:

crontab -e

3. 定时任务格式

定时任务的格式通常如下:

* * * * * <command>
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └─── 星期几 (0 - 7) (Sunday is 0 or 7)
│ │ │ └────── 月份 (1 - 12)
│ │ └────────── 日 (1 - 31)
│ └────────────── 小时 (0 - 23)
└───────────────── 分钟 (0 - 59)

示例

  • 30 2 * * * /path/to/command:每天凌晨 2:30 执行 /path/to/command。
  • 0 9 * * 1-5 /path/to/script.sh:每周一到周五的 9:00 执行 /path/to/script.sh。

4. 定时任务的常见例子

  • 每小时执行一次脚本:
0 * * * * /path/to/script.sh
  • 每天凌晨 2:00 执行备份:
0 2 * * * /usr/bin/rsync -av /source /backup
  • 每月 1 号执行清理日志:
0 0 1 * * /path/to/cleanup_logs.
  • 每分钟执行一次:
* * * * * /path/to/check_process.sh

5. Cron Job 的时间字段补充说明

  • 分钟 (0-59)
  • 小时 (0-23)
  • 日 (1-31)
  • 月份 (1-12)
  • 星期几 (0-6 或者 Sun-Sat,0 和 7 都代表周日)

6. 特殊字符用法

  • 星号 ():表示“每”。
    • 例如, * * * * 表示每分钟、每小时、每天、每月、每周都会执行。
  • 逗号 (,):用来指定多个值。
    • 例如,1,15 * * * * 表示每小时的第 1 分钟和第 15 分钟执行任务。
  • 连字符 (-):用来指定范围。
    • 例如,5-10 * * * * 表示每小时的 5 分钟到 10 分钟执行任务。
  • 斜杠 (/):用于设置步长(例如,表示每隔几个时间单位执行一次任务)。
    • 例如,*/5 * * * * 表示每 5 分钟执行一次任务。

7. 设置系统级定时任务(系统级 cron)

系统级的定时任务通常是管理员级别的,通过修改 /etc/crontab 文件来设置:

sudo vi /etc/crontab

格式:

* * * * * username <command>

例如,系统级任务:

0 3 * * * root /path/to/backup.sh

表示每天 3:00 AM 执行 backup.sh 脚本。

8. Cron 日志

在某些系统中,cron 作业的执行会被记录在 /var/log/syslog 或 /var/log/cron 中。你可以查看日志来调试 cron 作业:

tail -f /var/log/cron

9. 其他有用的命令

  • 查看特定用户的定时任务:

    sudo crontab -u username -l
    
  • 移除当前用户的所有定时任务:

    crontab -r
    
  • 查看 cron 服务状态:

sudo systemctl status cron

10. 限制 cron 执行环境

默认情况下,cron 执行任务时不会加载用户的 shell 配置文件(如 .bashrc),因此如果任务依赖于某些环境变量,可能需要在 cron 文件中显式指定它们。

例如,设置 PATH 环境变量:

PATH=/usr/bin:/bin:/usr/sbin:/sbin
* * * * * /path/to/command

11. 使用python进入任务调度管理器

import schedule
import time
import sys

class TaskSchedulerManager:
    def __init__(self):
        self.tasks = {}

    def list_tasks(self):
        """列出当前所有定时任务"""
        if not self.tasks:
            print("当前没有任何任务。")
        else:
            print("当前所有任务:")
            for task_name, task_info in self.tasks.items():
                print(f"任务名称: {task_name}, 间隔: {task_info['interval']}, 上次执行: {task_info['last_run']}")

    def create_task(self, task_name, job_func, interval, unit="minutes"):
        """创建一个新的定时任务"""
        # 根据单位(分钟/小时/秒)设置任务间隔
        if unit == "minutes":
            job = schedule.every(interval).minutes.do(job_func)
        elif unit == "hours":
            job = schedule.every(interval).hours.do(job_func)
        elif unit == "seconds":
            job = schedule.every(interval).seconds.do(job_func)

        self.tasks[task_name] = {
            'job': job,
            'interval': f"{interval} {unit}",
            'last_run': None
        }

        print(f"任务 '{task_name}' 已创建,计划每 {interval} {unit} 执行。")

    def delete_task(self, task_name):
        """删除指定的任务"""
        if task_name in self.tasks:
            job = self.tasks[task_name]['job']
            schedule.cancel_job(job)
            del self.tasks[task_name]
            print(f"任务 '{task_name}' 已删除。")
        else:
            print(f"错误:任务 '{task_name}' 不存在。")

    def modify_task(self, task_name, new_interval, unit="minutes"):
        """修改任务的执行间隔"""
        if task_name in self.tasks:
            # 先删除旧任务
            self.delete_task(task_name)
            # 然后重新创建任务
            job_func = self.tasks[task_name]['job'].job_func
            self.create_task(task_name, job_func, new_interval, unit)
            print(f"任务 '{task_name}' 的执行间隔已修改为每 {new_interval} {unit}。")
        else:
            print(f"错误:任务 '{task_name}' 不存在。")

    def run(self):
        """开始运行任务调度"""
        while True:
            schedule.run_pending()  # 检查并运行所有挂起的任务
            time.sleep(1)  # 每秒钟检查一次


# 示例任务函数
def job_task_1():
    print("任务 1 执行!")

def job_task_2():
    print("任务 2 执行!")

def main():
    manager = TaskSchedulerManager()

    while True:
        print("\n定时任务管理器")
        print("1. 查看所有任务")
        print("2. 创建新任务")
        print("3. 删除任务")
        print("4. 修改任务间隔")
        print("5. 启动任务调度")
        print("6. 退出")

        choice = input("请输入选择的操作(1-6):")

        if choice == "1":
            manager.list_tasks()
        elif choice == "2":
            task_name = input("请输入任务名称:")
            interval = int(input("请输入任务间隔:"))
            unit = input("请输入时间单位(minutes/hours/seconds):").lower()
            if unit not in ["minutes", "hours", "seconds"]:
                print("无效的时间单位,请重新输入。")
                continue
            if task_name == "任务1":
                manager.create_task(task_name, job_task_1, interval, unit)
            elif task_name == "任务2":
                manager.create_task(task_name, job_task_2, interval, unit)
            else:
                print("无效的任务名称。")
        elif choice == "3":
            task_name = input("请输入任务名称:")
            manager.delete_task(task_name)
        elif choice == "4":
            task_name = input("请输入任务名称:")
            new_interval = int(input("请输入新的任务间隔:"))
            unit = input("请输入新的时间单位(minutes/hours/seconds):").lower()
            if unit not in ["minutes", "hours", "seconds"]:
                print("无效的时间单位,请重新输入。")
                continue
            manager.modify_task(task_name, new_interval, unit)
        elif choice == "5":
            print("启动任务调度...")
            manager.run()
        elif choice == "6":
            sys.exit("退出定时任务管理器")
        else:
            print("无效的选择,请重新输入。")

if __name__ == "__main__":
    main()

总结

通过 cron,你可以非常灵活地在 Linux 系统中设置定时任务,执行周期性工作。最常见的操作包括使用 crontab -e 编辑个人任务,设置脚本或命令在指定时间运行。


http://www.kler.cn/a/444345.html

相关文章:

  • Word图片嵌入格式不正确的解决办法
  • 谷歌建筑下载
  • uniApp使用腾讯地图提示未添加maps模块
  • android recycleview 中倒计时数据错乱
  • Go vendor
  • RestTemplate实时接收Chunked编码传输的HTTP Response
  • 设计模式-读书笔记2
  • Docker+Redis单机和集群部署【非常详细】
  • Android 获取屏幕物理尺寸
  • 建站技术 | HUGO + GitHub 创建博客页面
  • 若依前端挂Nginx、打包部署运行!!!!
  • C# 项目无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块
  • Leetcode 409. Longest Palindrome
  • BERT模型入门(1)BERT的基本概念
  • 条件随机场(CRF)详解:原理、算法与实现(深入浅出)
  • 【软件工程】简答题系列(山东大学·软院考试专属)
  • pytest接口关联框架封装
  • 将三个list往一个excel表的三个sheet中写入,能用多线程提高写入速度
  • Stream的并行方法parallelStream使用和常见问题
  • python飞机大战游戏.py
  • 详细指南:在Ubuntu 20.04上安装和配置Orbbec SDK及USB设备权限
  • 太速科技-428-基于XC7Z100+ADRV9009的双收双发无线电射频板卡
  • 《Django 5 By Example》读后感
  • 【uniapp】实战一人员交接班
  • 【go语言】reflect包与类型推断
  • 电视机通用遥控技术标准正式公布