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
相关产品推荐
相关产品推荐

