Crontab执行.js爬虫脚本无法将抓取数据写入数据库问题求助
问题核心原因
手动执行脚本正常、syslog显示crontab已触发但数据库无写入,本质是crontab运行时的执行上下文和你手动登录shell的上下文不一致。crontab默认使用极简环境,不会自动加载用户目录下的.bashrc、.profile、nvm配置等文件,也不会继承你手动登录时设置的各类环境变量,仅靠syslog的cron触发记录只能确认定时任务拉起了进程,完全无法感知进程内部的执行错误。
排查步骤
- 第一步:捕获任务全量执行日志
不要只看系统cron日志,先给定时规则加上输出重定向,把标准输出、标准错误全部写入指定文件,才能看到真实报错。以你配置的5分钟任务为例,修改为:*/5 * * * * su scrapers -c "cd /home/scrapers/data-sources && /home/scrapers/.nvm/nvm-exec yarn workspace ma-be-mer node index.js" > /tmp/crawler_cron.log 2>&1
等任务触发后直接查看/tmp/crawler_cron.log的内容,绝大多数场景下报错会直接写明问题:比如数据库连接参数缺失、依赖包找不到、执行权限不足、可执行文件路径错误。 - 第二步:对比环境变量差异
爬虫连库的参数(地址、账号、密码、端口)如果是从环境变量读取,crontab环境下缺失这类变量是最常见的写入失败原因。可以临时加一条定时规则打印crontab下的环境变量:* * * * * su scrapers -c "env" > /tmp/cron_env.log,再手动切到scrapers用户执行env > /tmp/manual_env.log,对比两个文件的PATH、NODE_ENV、数据库相关配置项的差异即可定位缺失的变量。 - 第三步:修正明显的路径配置错误
你配置的2分钟执行规则存在硬伤:/home/scrapers/.nvm/versions/node/v16.15.0/bin/node是二进制可执行文件,不是目录,后面拼接/nvm-exec属于非法路径,执行时会直接报“文件或目录不存在”的错误,这条规则本身就无法正常运行。
解决方法
- 优先用登录态加载用户环境
把su scrapers改为su - scrapers,加-参数会模拟用户完整登录流程,自动加载scrapers用户下的所有shell配置、nvm环境变量,不需要手动写死node、yarn的绝对路径,修改后的规则为:*/5 * * * * su - scrapers -c "cd /home/scrapers/data-sources && yarn workspace ma-be-mer node index.js" > /tmp/crawler_cron.log 2>&1 - 手动声明依赖的环境变量
如果不想加载全量用户配置,可以在crontab文件顶部提前定义脚本运行需要的所有环境变量,示例:SHELL=/bin/bash PATH=/home/scrapers/.nvm/versions/node/v16.15.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 补充你的脚本依赖的数据库、业务相关环境变量 DB_HOST=实际数据库地址 DB_PORT=实际数据库端口 DB_USER=实际数据库账号 DB_PWD=实际数据库密码 NODE_ENV=production */5 * * * * cd /home/scrapers/data-sources && yarn workspace ma-be-mer node index.js > /tmp/crawler_cron.log 2>&1 - 权限校验
切到scrapers用户身份手动执行一遍爬虫命令,确认该用户对项目目录、临时文件目录有完整读写权限,避免因权限不足导致配置读取失败、写入中断。 - 相对路径校验
确认脚本内所有读取配置、写临时文件的逻辑,如果用了相对路径,必须保证执行命令前已经cd到项目根目录,不要依赖crontab的默认工作目录。
内容的提问来源于stack exchange,提问作者Shah
相关产品推荐
相关产品推荐

