【问题标题】:Azure Batch Linux vm running scriptAzure Batch Linux vm 运行脚本
【发布时间】:2017-04-18 07:12:27
【问题描述】:

我正在尝试通过创建 linux vm 来使用 Azure 批处理服务。我有一些我正在使用 python 的计算。要安装一些 python 包,我已将安装命令放在脚本文件中并尝试在启动时运行它。

 pool.StartTask = new StartTask
            {
                // Specify a command line for the StartTask that copies the task application files to th
                 CommandLine = "bash -c \"bash /mnt/batch/tasks/startup/wd/installpackages.sh\"",
                ResourceFiles = resourceFiles,
                WaitForSuccess = true,
                MaxTaskRetryCount = 5
            };

由于权限问题,此脚本执行失败。当我尝试使用“sudo”运行脚本时,会出现以下错误,

sudo: no tty present and no askpass program specified

脚本由用户“_azbatch”执行,使用 sudo 时会提示输入我不知道的密码。

如何克服这个问题?

【问题讨论】:

  • 一开始我不能使用 sudo,而且我想分拆大约 50 个虚拟机,所以我不能 ssh 进入每台机器。
  • 我检查了日志。我在脚本中加入了“whoami”并看到了输出。用户是“_azbatch”

标签: python linux azure azure-batch


【解决方案1】:

如果您使用的是 Azure Batch C# SDK 6.0.0 或更高版本(或 Azure Batch Python SDK 2.0.0 或更高版本),则需要在 StartTask 对象中指定正确的 UserIdentity

pool.StartTask.UserIdentity = new UserIdentity(
    new AutoUserSpecification(
        scope: AutoUserScope.Pool,
        elevationLevel: ElevationLevel.Admin
    )
)

如果您使用上述 SDK 之前的版本,则需要将 StartTask 对象 RunElevated 成员设置为 true

使用这些选项,您应该从脚本中删除 sudo,因为您的脚本将自动以超级用户或管理权限运行。

关于以下内容的附加说明:

/mnt/batch/tasks/startup/wd/installpackages.sh

您永远不应该直接引用路径。您可以改为使用:

bash -c "bash $AZ_BATCH_TASK_WORKING_DIR/installpackages.sh"

或者简单地说:

bash ./installpackages.sh

您甚至可以删除 bash 显式调用,方法是在 shell 脚本顶部添加适当的 shebang 语句并调用为 ./installpackages.sh

Batch 会将当前工作目录设置为任务的工作目录以执行命令。您可以查看 Batch 自动为任务执行设置的所有环境变量here

【讨论】:

  • 完美。谢谢。
【解决方案2】:

根据您的描述,根据我的理解,您希望在 Azure Batch Services 批量创建的 Azure Linux VM 上安装相同的包。

根据我的经验,我认为您可以通过一些并行 SSH 工具(例如 psshorgalorgParallecerlyssh 等)在所有机器上同时手动执行这些安装。这是一种解决方法。一些python包在安装时需要编译器支持,所以我认为在不确定的情况下手动操作可能是更好的选择。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 2022-10-24
    • 2022-01-16
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多