我正在从 js 脚本连接到 mongodb(在 Ubuntu 机器上);当我从命令行执行命令时(
node name of the script
)一切正常,但是当我从 cron 执行相同的命令时,连接超时:
const mongodb = require("mongodb").MongoClient;
async function dbConnection() {
// I've checked this variable and it's valid both when executed as cron or
// simply from command line
let url = env.DB_URL;
// Mongo options
let opts = {
useNewUrlParser: true,
useUnifiedTopology: true
};
try {
return mongodb.connect(url, opts);
} catch (err) {
throw err;
}
}
async function DataLoading() {
try {
let dbInstance;
try {
dbInstance = await dbConnection()
if(!dbInstance)
throw "DB connection failed"
} catch (err) {
errors.push({
date: new Date().toISOString(),
error: err,
location: "Db connection"
});
}
console.log("Time elapsed: " + (new Date() - time) )
// On cron dbInstance is undefined, causing an error, on command line it's what's supposed to
let dbStocks = dbInstance.db(env.DB_NAME).collection("stocks")
作为 cron 执行时,经过的控制台日志大约为 30 秒,从命令行执行时为几百毫秒。
注意:当我说命令行时,我指的是服务器的命令行(mongo 在本地主机上),而不是我的远程个人计算机。
这可能是由于缺少环境变量造成的。您需要在 crontab 本身中手动设置脚本的环境,或者让脚本直接从文件(或其他源)加载配置的值。
例如
* * * * * DB_URL=localhost:27017 DB_NAME=my_db node name_of_script
Cron 作业在非交互式、非登录 shell 中执行;因此,他们不获取默认的 shell 启动脚本 - 例如
~/.bashrc
和 ~/.bash_profile
- 并且无法访问您在当前终端会话期间设置的相同环境变量。
配置 cron 作业的方法有很多。您最终使用哪一种取决于您的特定环境、最佳实践和个人喜好。