我在以下路径有一个节点脚本
/Users/SomeName/Desktop/Personals/auto-stock2/update_contracts.js
我想在工作日的上午 9:30 - 下午 4:00 之间每 5 分钟执行一次这个脚本,这是我的 cronjob:
30-59/5 9 * * 1-5 /usr/local/bin/node /Users/SomeName/Desktop/Personals/auto-stock2/update_contracts.js > /var/log/update_contracts_job.log 2>&1
*/5 10-15 * * 1-5 /usr/local/bin/node /Users/SomeName/Desktop/Personals/auto-stock2/update_contracts.js > /var/log/update_contracts_job.log 2>&1
0 16 * * 1-5 /usr/local/bin/node /Users/SomeName/Desktop/Personals/auto-stock2/update_contracts.js > /var/log/update_contracts_job.log 2>&1
如您所见,我提供了节点和脚本的绝对路径;无论出于何种原因,该脚本永远不会运行。我一直在检查
update_contracts_job.log
文件来验证这一点。
从我的用户目录运行
crontab -l
将返回 crontab 的内容。我还运行了 sudo crontab -u SomeName -l
,它也显示了该文件。
我通过在本地查看邮件获得了一些反馈:
cd /var/mail
cat SomeName
邮件正文注明:
/bin/sh: /var/log/update_contracts_job.log: Permission denied
似乎是某种类型的权限问题导致日志无法写入。我已经从我的 cronjob 中删除了写入日志文件的部分
> /var/log/update_contracts_job.log 2>&1
,现在我看到了这个错误
Error: EPERM: operation not permitted, open '/Users/SomeUser/Desktop/Personals/auto-stock2/update_contracts.js'
at Object.openSync (fs.js:476:3)
at Object.readFileSync (fs.js:377:35)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1090:18)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Function.executeUserEntryPoint Äas runMainÅ (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47 ä
errno: -1,
syscall: 'open',
code: 'EPERM',
path: '/Users/SomeUser/Desktop/Personals/auto-stock2/update_contracts.js'
å
这是因为 cron 没有完整的磁盘访问权限。按照本文将 cron 添加为完全访问权限:https://www.hashbackup.com/hashbackup/technical/fulldiskaccess.html