You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3 Cron任务创建文件报错FileNotFoundError[Errno2]求助

问题原因及解决方法

问题原因

/run/user/[UID] 是 systemd 为活跃登录会话创建的临时用户目录,仅在用户通过终端、图形界面等方式登录时才会存在。crontab 执行的脚本属于无交互的后台进程,不会触发 systemd 创建该用户会话目录,系统更新后可能强化了这一机制,导致脚本找不到路径抛出错误。

解决方法

1. 脚本内提前创建目录

在创建锁文件前,先检查并生成目标目录,避免路径不存在的问题:

import os
lock_file = '/run/user/' + str(os.getuid()) + '/running_application.lock'
# 先创建目录,exist_ok=True 避免目录已存在时报错
os.makedirs(os.path.dirname(lock_file), exist_ok=True)
# 再创建锁文件
with open(lock_file, 'x'):
    print(f"Lockfile {lock_file} created")

2. 更换锁文件存储路径

放弃依赖会话目录,将锁文件放到用户主目录等稳定路径:

import os
lock_file = os.path.expanduser('~/running_application.lock')
with open(lock_file, 'x'):
    print(f"Lockfile {lock_file} created")

3. 使用 systemd 用户定时器替代 crontab

如果必须使用 /run/user 目录,改用 systemd 用户定时器,它会自动激活用户会话并创建 /run/user/[UID] 目录:

  • 创建定时器配置文件 ~/.config/systemd/user/my_application.timer:
[Unit]
Description=定时运行我的应用脚本

[Timer]
# 按需求设置定时规则,比如每天凌晨2点运行
OnCalendar=daily *-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target
  • 创建服务配置文件 ~/.config/systemd/user/my_application.service:
[Unit]
Description=运行我的应用脚本

[Service]
ExecStart=/usr/bin/python3 /home/username/bin/my_application.py
WorkingDirectory=/home/username
  • 启用并启动定时器:
systemctl --user daemon-reload
systemctl --user enable --now my_application.timer

内容的提问来源于stack exchange,提问作者maxmoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:13:24