【问题标题】:Executing Azure CLI from shell script as cron job从 shell 脚本执行 Azure CLI 作为 cron 作业
【发布时间】:2014-04-24 01:40:21
【问题描述】:

在 shell 脚本中唱出 Azure CLI 和 Node JS 的完整路径。

#!/bin/bash
/opt/nodejs/bin/node /opt/nodejs/bin/azure vm disk list > /tmp/tmpfile

/opt/nodejs/bin/node /opt/nodejs/bin/azure vm disk upload $SRCURL $DESURL <KEY>

手动执行时,两个命令都成功执行。但是当使用 crontab 执行时,vm disk list 命令可以工作,但vm disk upload 不能工作。

Azure JS 脚本需要另一个通过相对路径 var AzureCli = require('../lib/cli'); 引用的 cli.js,而 cli.js 脚本需要通过相对路径引用的许多其他脚本。

有没有什么方法可以为用户提供与 cron 相同的环境配置文件,因此它可以工作,或者有没有最好的方法可以在不编辑单个 JS 文件并将相对路径重命名为绝对路径的情况下完成这项工作?

【问题讨论】:

    标签: linux node.js shell azure cron


    【解决方案1】:

    问题是因为通过 cron 执行时未设置 HOME 环境变量,这导致 Azure 命令失败。

    HOME 变量在脚本中设置为特定用户的主目录时,它可以正常工作。

    【讨论】:

      【解决方案2】:

      您可以在 /etc/profile 文件的 PATH 环境变量中设置所需文件的路径

      export PATH=$PATH:/path to your files
      

      【讨论】:

      • 奇怪的是PATH在这里不是问题。我验证了 PATH 变量在我手动或通过 cron 执行时包含相同的路径。这里的问题是 Node JS 无法识别各种 .js 文件所需的库文件的相对路径。如果有一些选项可以指定类似于 Perl/Ruby 的 Node JS 的库位置,它将解决此问题。
      【解决方案3】:

      只需在 cron 中重新声明环境变量。

      示例 crontab:

      NODE_ENV=production
      * * * * * /bin/sh /path/to/your/shellscript/nodejs
      

      【讨论】:

        【解决方案4】:

        检查环境变量SHELL=/bin/sh。 大多数时候/bin/sh 是指向/bin/bash 的符号链接,但在Ubuntu 上/bin/sh 是指向/bin/dash 的符号链接:

        $ ls -la /bin/sh
        lrwxrwxrwx 1 root root 4 feb 19  2014 /bin/sh -> dash
        

        所以在这种情况下你需要重新声明这个环境变量:

        export SHELL=/bin/bash
        

        就我而言,我在脚本中导出环境变量并在 crontab 中包含以下内容:

        # run azure test every 5 minutes
        */5 * * * * /opt/bin/azure-test >/tmp/azure-test.out 2>&1
        

        【讨论】: