cronR设置的执行R脚本更新数据库表的定时任务无报错不生效且无日志
故障排查步骤
1. 确认定时任务是否实际写入系统crontab
cronR控制台无报错仅代表接口调用成功,不代表任务真的写入了系统定时任务列表。直接在系统终端执行命令:crontab -l
查看输出结果中是否存在id为Automated_scheduler_test_3的对应任务,若不存在则是R进程无crontab写入权限,可手动将生成的cron规则复制后通过sudo crontab -e写入。
2. 开启运行日志排查执行错误
查看系统默认cron日志
- Linux系统默认cron日志路径为
/var/log/cron,也可执行grep CRON /var/log/syslog过滤相关日志 - macOS系统可执行
log show --predicate 'process == "cron"' --last 1h查询最近1小时的cron执行记录
自定义任务日志(更推荐)
修改创建cron任务的代码,直接指定日志输出路径,所有运行报错、打印信息都会写入指定文件:
library(cronR) # 路径改为绝对路径,空格转义或用引号包裹,避免cron识别失败 path = "/Users/你的用户名/Documents/GitHub/abcdef/some_folder/DBI dummy.R" # 指定日志文件路径 cmd = cron_rscript(path, log_append = TRUE, log_file = "/Users/你的用户名/cron_test_log.log") # 测试阶段可以删掉at参数,立刻启动分钟级执行 cron_add(cmd, frequency = "minutely", days_of_week = c(1:5), id = "Automated_scheduler_test_3", description = "Testing_for_sample")
3. 现有代码的已知问题修复
你的R脚本和定时规则存在多处必然导致执行失败的问题:
- 定时规则问题:你设置了
at = "3:15PM",在minutely频率下代表仅每天下午3点15分之后才会执行任务,非该时段任务不会触发,测试时可删除该参数。 - 路径识别问题:你使用的
~路径、带空格的文件名DBI dummy.R在cron的极简执行环境中大概率解析失败,所有路径统一改为完整绝对路径。 - R环境问题:cron执行时默认不会加载你本地用户的R环境配置,会出现找不到安装包的报错,在待执行R脚本的第一行添加你的本地R包路径,可在R控制台执行
.libPaths()获取路径后填入:.libPaths("你本地的R包安装绝对路径") library(DBI) library(dplyr) - 脚本逻辑硬伤:你先执行
dbRemoveTable删除了目标表,紧接着又用dbReadTable读取同一张已删除的表,这一步必然报错,建议调整逻辑:先读表抽样,再删除旧表写入新表,同时复用数据库连接避免重复连接报错:library(DBI) library(dplyr) # 复用同一个连接,不要反复调用连接函数 con <- connect_to_database(schema = "*schema name*") # 先读表抽样 sample_data <- sample_n(dbReadTable(con, "*table_name*"),5) # 再删旧表写新数据 dbRemoveTable(con, "*table_name*") table_id <- Id(database="*database_name*", schema="*schema_name*", table="*table_name*") dbWriteTable(con, table_id, sample_data, overwrite = TRUE) dbDisconnect(con) - 数据库权限问题:若你本地的数据库连接依赖
.env配置文件、系统密钥环等环境信息,cron执行时无法读取这些配置,需要在脚本开头手动加载.env文件的绝对路径,或临时写入数据库认证信息测试。
内容的提问来源于stack exchange,提问作者molassesthemajesticshooteater
相关产品推荐
相关产品推荐

