cron 是 Linux/Unix 系统里的一个守护进程(后台程序),专门用来定时执行你指定的任务(命令、脚本等)。
你把想定时执行的命令写到crontab(cron 表)里,cron 会根据你设定的时间点自动触发执行。
测试脚本:main.py
import tkinter as tk
from datetime import datetime
def update_time():
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
label.config(text=now)
root.after(1000, update_time) # 每1000毫秒(1秒)更新一次
root = tk.Tk()
root.title("当前时间显示")
root.geometry("300x100")
label = tk.Label(root, text="", font=("Helvetica", 18))
label.pack(expand=True)
update_time() # 初次调用
root.mainloop()
1. 环境准备:
确认程序能手动运行并显示界面(在这里注意我的路径和你的路径是否有区别 )
/usr/bin/python3 /home/admin/StampFeedDetect/main.py
确认当前桌面环境的环境变量:
echo $DISPLAY
echo $XAUTHORITY
echo $DISPLAY # 一般是 :0
echo $XAUTHORITY # 一般是 /home/admin/.Xauthority
2. 创建日志目录(如果没创建)
mkdir -p /home/admin/StampFeedDetect/logs
3. 编写启动脚本 start_main.sh
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/home/admin/.Xauthority
cd /home/admin/StampFeedDetect
LOGFILE="/home/admin/StampFeedDetect/logs/schedule.log"
MAIN_SCRIPT="/home/admin/StampFeedDetect/main.py"
echo "[START] $(date '+%Y-%m-%d %H:%M:%S') - Starting main.py" >> "$LOGFILE"
nohup /usr/bin/python3 "$MAIN_SCRIPT" >> /home/admin/StampFeedDetect/logs/main_output.log 2>&1 &
PID=$!
echo "$PID" > /home/admin/StampFeedDetect/main.pid
echo "Started with PID $PID" >> "$LOGFILE"
给脚本加执行权限:
chmod +x /home/admin/StampFeedDetect/start_main.sh
4. 编写停止脚本 stop_main.sh
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/home/admin/.Xauthority
LOGFILE="/home/admin/StampFeedDetect/logs/schedule.log"
PIDFILE="/home/admin/StampFeedDetect/main.pid"
if [ ! -f "$PIDFILE" ]; then
echo "[STOP] $(date '+%Y-%m-%d %H:%M:%S') - No PID file found. Process might not be running." >> "$LOGFILE"
exit 1
fi
PID=$(cat "$PIDFILE")
if ps -p $PID > /dev/null 2>&1; then
kill $PID
echo "[STOP] $(date '+%Y-%m-%d %H:%M:%S') - Stopped main.py with PID $PID" >> "$LOGFILE"
rm "$PIDFILE"
else
echo "[STOP] $(date '+%Y-%m-%d %H:%M:%S') - Process with PID $PID not found. Maybe already stopped." >> "$LOGFILE"
rm "$PIDFILE"
fi
同样给执行权限:
chmod +x /home/admin/StampFeedDetect/stop_main.sh
5. 编辑用户的 crontab
crontab -e
添加定时任务(比如每天 21:49 启动,21:50 停止)/ 先测试
49 21 * * * DISPLAY=:0 XAUTHORITY=/home/admin/.Xauthority /home/admin/StampFeedDetect/start_main.sh
50 21 * * * DISPLAY=:0 XAUTHORITY=/home/admin/.Xauthority /home/admin/StampFeedDetect/stop_main.sh
6. 验证
手动运行启动脚本
bash /home/admin/StampFeedDetect/start_main.sh
检查日志:
cat /home/admin/StampFeedDetect/logs/schedule.log
cat /home/admin/StampFeedDetect/logs/main_output.log
查看进程:
ps -p $(cat /home/admin/StampFeedDetect/main.pid)
手动停止:
bash /home/admin/StampFeedDetect/stop_main.sh
7. 注意事项
确保脚本文件用的是 Unix 格式换行,避免 Windows 格式导致执行失败
确保 mainn.py
程序无异常能正常启动和退出
如果你使用其他显示(非 :0
),需调整 DISPLAY
值
日志文件会积累,可以定期清理
8. 关闭定时任务
执行命令编辑当前用户的定时任务
crontab -e
找到你之前添加的定时任务行,比如:
49 21 * * * DISPLAY=:0 XAUTHORITY=/home/admin/.Xauthority /home/admin/StampFeedDetect/start_mainn.sh
50 21 * * * DISPLAY=:0 XAUTHORITY=/home/admin/.Xauthority /home/admin/StampFeedDetect/stop_mainn.sh
然后注释掉就可以