代码之家  ›  专栏  ›  技术社区  ›  Catfish

Ubuntu cron shebang无法工作

  •  3
  • Catfish  · 技术社区  · 11 年前

    我有一个剧本 #!/usr/bin/env node .

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

    当我以我的用户的身份运行脚本时,脚本运行得很好,只是不是cron。我猜这是因为节点不在运行cron的用户的PATH上?

    我怎样才能让这个shebang与cron一起工作?

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

    1 回复  |  直到 11 年前
        1
  •  8
  •   Keith Thompson    5 年前

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

    通过临时创建一个crontab条目,您可以看到该环境是什么样子的:

    * * * * * printenv > crontab-environment
    

    可以显式设置 $路径 在crontab中,或者在命令本身中:

    * * * * * 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 语法将目录附加到 $路径 因为在环境设置行中不替换变量引用。他们 在crontab命令行中处理。

    man 5 crontab 详细信息。

    另一个选项是在脚本本身中使用显式完整路径,更改

    #!/usr/bin/env node
    

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

    您需要为每个系统定制此功能,其中 node 安装在不同的位置。或者你可以安排 节点 (或 nodejs ?) 安装在一致的位置。