【问题标题】:Shell node: No such file or directoryShell节点:没有这样的文件或目录
【发布时间】:2019-09-19 01:21:42
【问题描述】:

我有一个每分钟运行一个 shell 脚本的 cron 作业。但是我不断得到

/usr/bin/env: node: No such file or directory
restarting
nohup: failed to run command ‘npm’: No such file or directory

作为输出。

我已尝试全局安装 pm2,但这不起作用。

这是我的 Shell 文件:

#!/bin/bash
PATH=$PATH: /home/dev/bin/npm
pID=$(pgrep -x "PM2") 

if [ -n "${pID}" ];
then
    #do nothing 
    echo $pID "already running. not restarting." 
else
    # start it 
    echo "restarting"
    nohup npm ./home/dev/public_node/server.js --production &
fi

应该通过pm2启动server.js文件?

【问题讨论】:

  • 添加PATH=$PATH:<pathToDirContainingPm2> 作为第二行。通过在终端中运行 type pm2 找到该目录。
  • 通常在哪里? @MarkSetchell
  • 启动终端并运行type pm2,它会告诉你路径。
  • 我更新了我的文件,现在我得到了一个不同的错误

标签: shell cron pm2


【解决方案1】:

您将之前的问题从未找到 pm2 编辑为未找到 node,但解决此问题的一种方法是确定任意工具的完整路径,如下所示:

NPM="`which npm`"

if [ "x" == "x$NPM" ]; then
    (>&2 echo "NPM not installed")
    exit 1
fi

# Run by using the variable like it's a regular command
# e.g.
nohup $NPM ./home/dev/public_node/server.js --production &

【讨论】:

  • 所以我试过了,得到了which: no npm in (/usr/bin:/bin) NPM not installed 但是当我在终端运行它时,我得到了路径?
  • 你能在你的普通shell中运行which npm并在这里发布输出吗? echo $PATH 的输出也会有所帮助。
  • 在 shell 中运行它我得到: ``` which: no npm in (/usr/bin:/bin) $PATH: ``` 和终端 ``` 哪个 NPM: /home /ellisdev/bin/npm 路径:/home/devfloder/perl5/bin:/usr/local/jdk/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/local/cpanel/3rdparty/ lib/path-bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/cpanel/composer/bin:/usr/local/bin:/usr/X11R6 /bin:/home/devfloder/.local/bin:/home/devfloder/bin ```
  • 这有点奇怪,因为/home/ellisdev/bin 不在您的PATH 上,但它是由which 找到的。你可以尝试在你的脚本中访问像nohup /home/ellisdev/bin/npm ... 这样的npm hardcoded 吗?您是在同一用户下运行脚本,即为运行 shell 的同一用户配置 cronjob,还是使用 sudo crontab -e 之类的东西配置 cron 作业?
  • 我没有太多的想法,但是尝试将以下PATH=$PATH: /home/dev/bin/npm更改为PATH=$PATH:/home/dev/bin/(删除空格并指向bin目录。PATH环境变量需要一个一组目录,你分配了一个可执行文件。希望它有帮助。也许其他人有更多的想法。:)
【解决方案2】:

我要感谢@Florian Schlag 帮助我找到答案并给了我正确的答案。我在下面粘贴了我的文件以供参考。请注意,我不得不更改一些文件,但这些可以从输出 npm 错误中推断出来。

#!/bin/bash
PATH=$PATH:/home/<user>/bin/
NPM="`which npm`"

if [ "x" == "x$NPM" ]; then
    (>&2 echo "NPM not installed")
    exit 1
fi

pID=$(pgrep "PM2" -f) 

if  [ -n "${pID}" ];
then
    exit 0
else
    # start it 
    echo "restarting"
    nohup $NPM start ./<file path ton script> --production &
fi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-12
    • 2017-05-14
    • 2018-08-09
    • 2017-09-13
    • 2015-09-27
    • 1970-01-01
    • 2018-08-24
    • 2020-09-23
    相关资源
    最近更新 更多