对 Cron 中的 PM2 重启进行故障排除

Posted

技术标签:

【中文标题】对 Cron 中的 PM2 重启进行故障排除【英文标题】:Troubleshooting PM2 Restart in Cron 【发布时间】:2021-06-23 12:56:42 【问题描述】:

更新:我无法按我的意愿进行这项工作。我最终使用了 pm2 --cron 标志,因为 cron 找不到我的 pm2 进程。

我在 bash 脚本中使用 pm2 restart,当由 cron(以 root 身份)运行时,它总是在 pm2 restart projectName 命令上失败,但在使用 sudo 手动运行时可以正常工作。我不确定如何排除故障,因为 pm2 日志文件没有显示任何明显的内容。看起来其他人有 the same issue 所以也许这只是一个错误?有其他人找到解决此问题的方法吗?

谢谢!

编辑:为@kevinnls 添加一些上下文

这是 .sh 脚本;我已经隔离了命令,所以我可以测试 cron

# Vars
NOW=$(date +"%Y-%m-%d")
LOGS_PATH="/scriptLoc/logs"
LOG_FILE="$LOGS_PATH/$NOW-log.txt"
BE_PATH="/beLoc"

# Start log file
date >> $LOG_FILE
echo "Running..." >> $LOG_FILE

# Temp
cd $BE_PATH
pm2 restart be >> $LOG_FILE
pm2 restart be || echo "ERROR: BE pm2 restart: $?" >> $LOG_FILE
echo "Done." >> $LOG_FILE
exit
如果我使用 sudo ./script.sh 运行命令,它会起作用 如果我使用 cron 运行它,我会在日志文件中看到以下输出:
Fri Mar 26 17:35:01 UTC 2021
Running...
Use --update-env to update environment variables
ERROR: BE pm2 restart: 1
Done.

如果我查看pm2 logs:

我看到它以代码 0 退出并在我手动运行脚本时重新启动。 我没有看到 cron 重启失败的输出

【问题讨论】:

您是否尝试过将pm2 restart 的输出记录到文件或检查mail(如果已配置)?它会抛出什么错误? 我更新了我的帖子以提供更多背景信息。我没有配置邮件。还有其他方法可以记录pm2 restart 的输出吗? 您所做的是 +1,但要将错误消息包含到日志中,请进行此更改 #redirect output and errors to log pm2 restart be &>> $LOG_FILE # if previous exit code != 0 do everything after `&&' [[ $? -ne 0 ]] && echo "ERROR: BE pm2 restart: $?" >> $LOG_FILE 好的 cmets 不适用于代码。 【参考方案1】:

我无法以我想要的方式解决这个问题。最终我将-c (cron) 标志与 pm2 本身一起使用。

pm2 cli reference

gitlab issue

【讨论】:

【参考方案2】:

你得到的错误:

[PM2][ERROR] Process or Namespace be not found

什么是“是”?似乎 cron 内部的 pm2 不知道该怎么做。

如果它是一个文件,当您在 shell 中运行脚本时,该文件 be 在您的工作目录中吗?


您可以进行这些更改以将错误消息记录到$LOG_FILE。 这应该可以帮助您获得更多详细信息。

#redirect output *and* errors to log 
pm2 restart be &>> $LOG_FILE
exit_code=$?
# if previous exit code != 0 do everything after `&&' 
[[ $exit_code -ne 0 ]] && echo "ERROR: BE pm2 restart: $exit_code" >> $LOG_FILE

然后尝试再次运行您的脚本并分享遇到的错误。

【讨论】:

该错误可能与 pm2 所需的某些环境变量在 cron 环境中不可用有关。这是人们面临的一个相当普遍的障碍。这也可以解释为什么它在你的 shell 中运行良好。 [PM2][ERROR] Process or Namespace be not found 所以我想我会停止并启动它而不是重新启动;现在就去试试 be 是进程名。我从pm2 start start.js --name be 开始。我也刚刚尝试pm2 restart 1 使用它的进程ID(未找到)以及pm2 restart all(未找到进程)。我也只是尝试让 cron 本身 run the restart command 但这也失败了。我要尝试的最后一件事是在 pm2 本身上使用 cron 标志。 您确定该进程归根用户所有吗? ? 相当肯定 - 我正在运行 sudo pm2 startsudo crontab -e。我能够让它与 pm2 --cron 标志一起工作,所以我现在就使用它。我向 pm2 提交了一个错误报告,所以如果我得到回复,我会更新这个。要批准您的回答,感谢您的所有帮助@kevinnls

以上是关于对 Cron 中的 PM2 重启进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法对 Oracle 中的更改通知进行故障排除?

如何对事件日志中的 .NET 2.0 错误报告消息进行故障排除?

对 signInManager.PasswordSignInAsync 进行故障排除 [重复]

对 Google Chrome 浏览器中的 SSL/TLS 握手进行故障排除

如何对 Delphi/C++Builder 中的设计时包进行故障排除?

如何在多写入器情况下对文件支持的共享内存中的大页进行故障排除