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 编辑个人任务,设置脚本或命令在指定时间运行。

    作者:LKIDTI数据

    物联沃分享整理
    物联沃-IOTWORD物联网 » Linux 定时任务操作详解及python简单的任务管理器

    发表回复