使用crontab定时运行R推特爬取脚本报错,是否需添加#!/usr/bash?
解决crontab运行R脚本的语法错误问题
这个问题我碰到过好多次,核心原因是crontab默认会用shell来解析你的脚本,但你的脚本是R代码,不是bash命令,所以才会抛出「syntax error near unexpected token」这类错误。直接加#!/usr/bash不仅没用,反而会让shell更混乱——因为它会把R代码当成bash命令来执行,自然看不懂。
给你两种靠谱的解决办法:
方法1:在crontab任务里直接指定用Rscript运行
这是最稳妥的方式,不需要修改你的R脚本本身。比如你的crontab定时任务可以这么写:
0 12 * * * /usr/local/bin/Rscript /Users/yourname/scripts/twitter_scraper.R
- 先通过终端命令
which Rscript查到你系统里Rscript的实际路径,替换上面的/usr/local/bin/Rscript - 一定要用脚本的完整绝对路径,因为crontab的默认工作目录不是你平时的用户目录,用相对路径会找不到文件
方法2:给R脚本添加正确的shebang开头
如果你想让脚本本身具备可执行权限,就在R脚本的第一行加上指向Rscript的shebang:
#!/usr/local/bin/Rscript # 下面是你的twitteR爬取代码 library(twitteR) # 这里放你的API认证和爬取逻辑 # ...
然后在终端里给脚本添加可执行权限:
chmod +x /Users/yourname/scripts/twitter_scraper.R
之后crontab里就可以直接写脚本的绝对路径了:
0 12 * * * /Users/yourname/scripts/twitter_scraper.R
额外提醒(避坑用)
crontab的环境变量和你平时打开终端的环境不一样,很容易踩坑:
- 可能找不到twitteR包:如果脚本运行后没结果,建议在脚本里加上日志输出,方便排查:
sink("/Users/yourname/scripts/twitter_scraper.log", append=TRUE) # 你的爬取代码 sink() - Twitter API认证失败:crontab可能读不到你平时终端里的环境变量,最好在脚本里直接写死认证信息(注意保密),或者用绝对路径读取你的配置文件。
内容的提问来源于stack exchange,提问作者spindoctor
相关产品推荐
相关产品推荐

