我有一个Typescript项目,使用morgan
和morgan-daily-rotate
进行日志记录。它在1台服务器上执行HTTP请求以获取一些股票信息,并在另一台服务器上更新该股票信息。当它运行时,它会以YYYY-MM-DD模式生成一个文件夹。我正在Windows机器上进行开发,并将其部署到Linode Ubuntu 22.04实例中。
我的项目目录:
build/
...
index.js
logs/
2022-10-04-20/ <- these folders will be generated depending on run date and time
combined.log
error.log
warn.log
src/
...
index.ts
run.sh
该项目放置在~/customerName/projectName/
中。在部署期间,Typescript项目被构建,并且只有build
文件夹与package.json一起被复制到Linode实例中,用于安装依赖项。
我设置了一个防火墙,允许http和https连接。ufw status
给出:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80,443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80,443/tcp (v6) ALLOW Anywhere (v6)
如果我在开发过程中在Windows机器上运行该项目,它运行得非常好,日志也很好地显示在logs
目录中的不同日期目录中。
如果我在~/customerName/projectName/
的Ubuntu实例上运行该项目,它也可以像开发一样正常工作。
但是,当我从cronjob启动命令时:
*/5 * * * * cd /home/user/customerName/projectName/ && node index.js > /home/user/customerName/projectName/logs/cron.log 2&>1
即使我告诉cron从项目目录开始,日志最终也会出现在~/logs
而不是~/customerName/projectName/logs
中。可能是因为它从用户的主目录执行cronjob。此外,日志中填充了包含Error: connect ECONNREFUSED ::1:80
的axios错误
摩根运输的一个例子:
const infoTransport: DailyRotateFile = new DailyRotateFile({
level: "info",
filename: "./logs/%DATE%/combined.log",
datePattern: "YYYY-MM-DD-HH",
maxSize: "20m",
maxFiles: "14d",
});
问题:
- 如何让cron从
~/customerName/projectName/
目录执行脚本 - 为什么在运行脚本时会得到
Error: connect ECONNREFUSED ::1:80
,因为用户本身工作正常 - 有点离题:我应该如何设置环境变量以在脚本中使用
提前感谢。
我找到了一种正确处理此问题的方法。实际上,我只是在项目目录中创建了与开发过程中使用的.env
文件完全相同的文件,并将其设置为BASH_ENV
变量。
我的crontab条目:
0 4 * * * BASH_ENV=/home/user/customerName/projectName/.env /home/user/customerName/projectName/run.sh > /home/user/customerName/projectName/logs/cron.log 2&>1
我的run.sh
#!/bin/sh
date
echo Starting customerName stock update on $PROJECTNAME_ENVIRONMENT
cd /home/user/customerName/projectName
/home/user/.nvm/versions/node/v16.17.1/bin/node index.js