Linux —— 定时任务(sleep、crontab、at)

目录

1、使用 sleep 来完成定时任务

2、使用 crontab 来进行定时任务

3、使用 at 来执行单次的定时任务


 

1、使用 sleep 来完成定时任务

        sleep n           等待 n 再继续往后执行 

        usleep n        等待 n 微秒再继续往后执行(1 秒等于 1 000 000 微秒)

# 定时,每分钟的第二十秒,输出一条信息

t=0
while [[ 1 -eq 1 ]];        # 无限循环
do
	d=`date "+%S"`
	d=`expr $d + 0`        # 如果秒为个位数,则十位上有一个0,通过计算把0去掉
	if [[ $d -eq 20 ]]; then
		echo `date "+%Y-%m-d %H-%M-%S"`
		((t++))
		sleep 1            # 间隔一秒后继续,不然程序执行太快,同一秒可能会输出多次
	fi
	if [[ $t -gt 3 ]]; then        # 只进行四次
		break
	fi
done 

 

2、使用 crontab 来进行定时任务

        确保 crond 服务处于启动状态:systemctl start crond。

        crontab 最小的单位是分钟,即最快是每隔一分钟执行一次。

crontab -l

查看当前有哪些定时任务

crontab -e

添加定时任务

crontab -r

删除目前的定时任务

        crontab -e 后,进入到编辑器中,每一行编写一个定时任务,格式说明如下。 

来自菜鸟教程

 

        program 可以是一个命令,也可以是一个 Shell 程序,推荐将定时执行的程序放到一个 Shell 程序中,让定时任务去执行 Shell 程序。 

        每分钟执行一次 /self/timing/outputTime.sh 这个程序(注意这个 Shell 程序要有执行权限。chmod u+x outputTime.sh 为用户添加执行权限):

        定时任务开启后,每隔一分钟,第一句的结果将通过邮件发送到 /var/spool/mail/root 中,第二句的结果将添加到指定的文件末尾(由于输出的文件是相对路径,当前的用户为 root,则crontab 执行后,会输出到 /root/outputTime.txt 中,即用户主目录下的 outputTime.txt 文件中 )。

 

分  时  月中第几日  第几月  周几

# 每两个小时执行一次,最后的 & 表示在后台进行执行,它不会阻塞cron的执行,允许cron继续检查和执行其他任务
0 */2 * * * /self/outputTime.sh &

# 每天7:30执行一次
30 7 * * * /self/outputTime.sh

# 每月1号和15号的22点执行一次
0 22 1,15 * * /self/outputTime.sh

# 每小时的第一分执行一次
1 * * * * /self/outputTime.sh

# 每周一至周五3点执行一次
0 3 * * 1-5 /self/outputTime.sh

# 每月的1、11、21、31日执行一次
30 6 */10 * * /self/outputTime.sh

 

crontab 的日志通常记录在系统的 /var/log/cron 或 、/var/log/syslog 中

 

3、使用 at 来执行单次的定时任务

        首次使用时安装 at :yum install at 

        启动 atd 服务:systemctl start atd

 

         at 基本格式

at [选项] [要执行的时间]

        时间可以是相对的也可以是绝对的。相对时间的设定是使用 now + 从现在开始要经过的时间。

at now + 3 minutes
at now + 3 hours
at now + 3 days
at now + 3 weeks
at now + 3 months
at now + 3 years


at 3:00 AM tomorrow
at 3:00 AM 08/01/2023
at 16:00 2023-12-30

 

        在一分钟之后向指定文件中追加 hello world。at -l 查看待执行的 at 任务。 

 

        使用管道符将要执行的内容传递给 at。在三天之后执行

 

        删除还未执行的任务

# 首先获取到其 id
at -l         # 或 atq

# 然后根据 id 删除该任务
at -d [id]    # 或 atrm [id]

 

 

<think>嗯,用户想了解如何在Python中使用schedule库设置定时任务,并要示例用法。这问题其实挺明确的,用户应该是刚接触定时任务实现的新手。用户之前提供了四个参考引用,内容都很实用。引用[1]展示了基础的时间点调度,引用[2]说明间隔执行任务,引用[3]展示按星期设置,引用[4]则是个高级用例——清理过期任务。要覆盖用户需求,得把这些典型场景都囊括进去。用户特别强调“尽可能参考引用内容”,说明ta需要实用性强、能直接复用的案例。考虑到用户可能遇到的实际问题,应该加入:1.基础安装步骤(因为有人总忘记pipinstall)2.时间格式的多样写法(用户没提但新手常卡在这里)3.取消任务的说明(引用没提但关键功能)4.错误处理(代码不报错对新人很重要)上次回答生成的问题质量很好,这次继续延续:任务并发、参数传递这些进阶问题用户可能暂时不需要,但提前问出来能帮ta拓展思路。最后那个资源占用问题特别实用——毕竟没人想写个定时任务把电脑卡死。用户情绪应该是比较急切的学习状态,回复要快且直给。把示例拆成原子操作很必要,ta可以像拼积木一样组合使用。引用[3]里那个周设置写得不规范,得按PEP8重写;引用[4]的datetime比较逻辑要加时区说明(有人复制代码后发现时间对不上)。要不要提APScheduler呢?用户当前需求schedule足够用了,但最后补充一句替代方案能体现专业性。对了,定时任务持久化这个点可能超纲,放在问题里让用户决定是否深入更好。</think> 以下是在Python中使用`schedule`库设置定时任务的详细说明及实用示例,参考并拓展了站内引用内容: --- ### **1. 基础用法** #### 1.1 安装库 ```bash pip install schedule ``` #### 1.2 按固定间隔执行 ```python import schedule import time def task(): print("任务执行中...") # 每10分钟执行一次 schedule.every(10).minutes.do(task) # 每隔1小时执行 schedule.every().hour.do(task) # 每天上午10:30执行 schedule.every().day.at("10:30").do(task) while True: schedule.run_pending() # 检查待执行任务 time.sleep(1) # 避免CPU满载 ``` > **关键点**:`run_pending()`需在循环中调用以触发任务检测,`time.sleep(1)`减少资源消耗[^2]。 --- ### **2. 高级场景示例** #### 2.1 按星期定时 ```python # 每周一12:40执行 schedule.every().monday.at("12:40").do(task) # 每周二和周四18:00执行 schedule.every().tuesday.at("18:00").do(task) schedule.every().thursday.at("18:00").do(task) ``` > **注意**:星期参数为英文小写(`monday`, `tuesday`等)[^3]。 #### 2.2 多任务并行 ```python def task1(): print("任务1启动") def task2(): print("任务2启动") # 每5秒执行task1,每分钟执行task2 schedule.every(5).seconds.do(task1) schedule.every().minute.do(task2) while True: schedule.run_pending() time.sleep(0.5) # 更频繁检测任务 ``` #### 2.3 带参数的任务 ```python def greet(name): print(f"你好, {name}!") # 每天8:00调用带参数的任务 schedule.every().day.at("08:00").do(greet, name="小明") ``` > **技巧**:`.do()`支持位置参数(`args`)和关键字参数(`kwargs`)传递[^1]。 --- ### **3. 实践技巧** #### 3.1 任务管理 ```python # 取消所有任务 schedule.clear() # 取消单个任务 job = schedule.every().day.at("09:00").do(task) schedule.cancel_job(job) ``` #### 3.2 自动清理过期任务(拓展引用[^4]) ```python import datetime def cleanup(max_age_hours=24): now = datetime.datetime.now() for job in schedule.get_jobs(): if (now - job.last_run) > datetime.timedelta(hours=max_age_hours): schedule.cancel_job(job) print(f"已清理过期任务: {job}") # 每6小时清理一次 schedule.every(6).hours.do(cleanup) ``` --- ### **4. 常见问题解决** - **时区问题**: `schedule`默认使用系统时区,需确保系统时间正确。若需指定时区,可在任务函数中转换: ```python import pytz def timezoned_task(): tz = pytz.timezone('Asia/Shanghai') now = datetime.datetime.now(tz) print(f"北京时间: {now}") ``` - **任务阻塞**: 长时间运行的任务会阻塞后续任务,解决方案: ```python import threading def long_job(): threading.Thread(target=complex_operation).start() # 在新线程中执行 ``` --- ### **替代方案建议** 对高精度或分布式定时需求,可考虑: - **APScheduler**:支持持久化存储和并发控制 - **Celery Beat**:适合分布式系统 - **操作系统级工具**:如Linux的`cron`(`crontab -e`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bodyHealthy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值