【问题标题】:Ubuntu cron shebang not workingUbuntu cron shebang 不工作
【发布时间】:2015-05-20 03:46:39
【问题描述】:

我有一个脚本,它是 shebang #!/usr/bin/env node

当 cron 运行我的脚本时,我收到此错误 /usr/bin/env: node: No such file or directory

当我以我的用户身份运行脚本时,脚本运行良好,只是不像 cron。我猜是因为 node 不在运行 cron 的用户的 PATH 上?

如何让这个 shebang 与 cron 一起工作?

$ which node 给我 /home/myuser/.nvm/v0.11.14/bin/node

【问题讨论】:

  • 你为什么不尝试node的完整路径?
  • 因为我认为在脚本中对节点使用 shebang 比调用 $ node myscript.js 更好。不过我可能是错的..
  • 我不是js专家,但是如果你说#!/usr/bin/env /full/path/to/node会发生什么?例如,您通过which node 获得的完整路径。
  • 我认为我不想这样做 b/c 每个用户的节点路径可能不同。请参阅我对问题的编辑,了解 which node 给了我什么。
  • 我会尝试的最后一件事是#!/usr/bin/env $HOME/.nvm/v0.11.14/bin/node。可能没有成功的机会。

标签: linux node.js ubuntu cron ubuntu-14.04


【解决方案1】:

Cron 作业在受限环境中运行。在交互式外壳中,您的$PATH 可能设置在您的$HOME/.bash_profile$HOME/.bashrc 中。 Cron 作业在没有获取这些文件的环境中执行,因此您的用户特定 $PATH 设置将不可用。

您可以通过临时创建一个 crontab 条目来查看该环境的样子:

* * * * * printenv > crontab-environment

您可以在 crontab 中显式设置 $PATH,也可以在命令本身中:

* * * * * PATH=$PATH:/home/myuser/.nvm/v0.11.14/bin some_command

或者在你的 crontab 中单独一行:

PATH = /usr/bin:/bin:/home/myuser/.nvm/v0.11.14/bin

您不能(直接)使用通常的PATH=$PATH:/new/dir 语法将目录附加到环境设置行中的$PATH,因为变量引用不会在这样的行中替换。它们在 crontab 命令行中处理

man 5 crontab了解详情。

另一种选择是在脚本本身中使用明确的完整路径,改变

#!/usr/bin/env node

#!/home/myuser/.nvm/v0.11.14/bin/node

您需要为在不同位置安装node 的每个系统自定义此项。或者您可以安排node(或nodejs?)安装在一致的位置。

【讨论】:

  • 我尝试创建一个临时 cron 来打印我的环境,但出现此错误:/bin/sh: 1: printenv: not found
  • 这很奇怪。 /usr/bin/printenv 存在吗?它应该作为 coreutils 包的一部分安装。在任何情况下,尝试env 而不是printenv(但env 也是coreutils 的一部分)。或者尝试指定printenvenv 命令的完整路径。
  • 53 * * * * env > /var/log/cron.log 2>&1 给我/bin/sh: 1: env: not found
  • shell 提示符下的type env 告诉您什么?如果结果是 env is /usr/bin/env,则在 cron 作业中将 env 替换为 /usr/bin/env。 (我开始认为你的系统出了点问题。)
  • 你建议这个PATH = $PATH:/home/myuser/.nvm/v0.11.14/binman 5 crontab 告诉我它不解析变量,所以这就是我最初设置 PATH 的原因,它导致env 在没有完整路径的情况下无法工作。
猜你喜欢
  • 2015-08-12
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多