Nodejs crontab 执行 pm2 命令

发布于 1周前 作者 yibo5220 来自 nodejs/Nestjs

Nodejs crontab 执行 pm2 命令

最近有个需求需要定时执行一些 pm2 命令,于是我就想到了将这些 pm2 命令写入一个.sh 脚本,然后直接用 crontab 定时执行这个脚本就行了

一开始直接在 sh 脚本里写 pm2 xxx,执行了下报pm2 command not found

于是 which 了一下 pm2 然后在 sh 里写上了 pm2 的完整路径,同时也单独执行了下这个 sh 脚本是没问题的 但是放在 crontab 里执行就报/usr/bin/env: node: No such file or directory

服务器 node 是用 nvm 安装的,所有操作都是同一个用户

奇怪的是两台服务器,一台能成功执行,另一台不能成功执行,两台环境都是一样的

Linux 这块知识比较薄弱,请教各位大神应该如何排查问题和解决


12 回复

应该是两台服务器的$PATH 变量的配置不同导致的吧


看了两台服务器的 PATH 是一样的

你是怎么看的?要看的是 crontab 执行的时候的$PATH 变量,不是一般用户登录上去之后的$PATH 变量

我在.bash 里看的,那 crontab 执行的时候的$PATH 变量 应该怎么看呢?

我在 /etc/crontab 文件里找到了,文件里的 PATH=/sbin:/bin:/usr/sbin:/usr/bin
我的 node 在如下路径里都有
/usr/bin/node /usr/lib/node /usr/local/bin/node /home/ec2-user/.nvm/versions/node/v8.11.1/bin/node

pm2 是个可执行的脚本文件,开头是 #!/usr/bin/env node 也就是会调用 env node 执行这个脚本文件。肯定是两个 env 配置不太一样。简单的改法是直接把 node 写在 pm2 前面就行,类似
* * * * * /usr/bin/node /path/to/pm2 command

感谢,按这个方法搞定了!

现在学 node 都可以不先学 linux 了吗

希望 V2EX 加入这种黑色主题来让用户查看

这个应该交给 systemd 才靠谱吧

在 Node.js 环境中,如果你想使用 crontab 来定时执行 pm2 命令(如重启某个应用),你可以按照以下步骤进行设置。

首先,确保你已经安装了 pm2 并且你的 Node.js 应用可以通过 pm2 管理。然后,编辑 crontab 文件:

crontab -e

crontab 文件中添加一行,指定何时运行 pm2 命令。例如,如果你想每天凌晨 2 点重启名为 myapp 的应用,可以添加如下行:

0 2 * * * /usr/local/bin/pm2 restart myapp

注意,/usr/local/bin/pm2pm2 命令的路径,你可以通过 which pm2 来确认它的实际路径。

另外,为了确保 crontab 可以正确执行 pm2 命令,你可能需要配置环境变量。可以在 crontab 文件中添加如下内容来设置环境变量:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# 然后添加你的定时任务
0 2 * * * /usr/local/bin/pm2 restart myapp

这是一个基本的设置。如果你的 pm2 使用了 JSON 配置文件或者需要更复杂的操作,你可能需要编写一个 shell 脚本来执行这些操作,然后在 crontab 中调用这个脚本。

例如,创建一个名为 restart_myapp.sh 的脚本:

#!/bin/bash
/usr/local/bin/pm2 restart myapp

然后给这个脚本执行权限,并在 crontab 中调用它:

chmod +x /path/to/restart_myapp.sh
0 2 * * * /path/to/restart_myapp.sh
回到顶部