用户数据脚本失败,没有给出原因

jja*_*nes 6 amazon-ec2

我正在使用Web控制台启动Amazon Linux实例(ami-fb8e9292),将数据粘贴到用户数据框中以在启动时运行脚本。如果我使用亚马逊给出示例来启动Web服务器,则它可以工作。但是,当我运行自己的脚本(也是#!/bin/bash脚本)时,它不会运行。

如果我查看var/log/cloud-init.log,它不会提供有关该主题的有用信息:

May 22 21:06:12 cloud-init[1286]: util.py[DEBUG]: Running command ['/var/lib/cloud/instance/scripts/part-001'] with allowed return codes [0] (shell=True, capture=False)
May 22 21:06:16 cloud-init[1286]: util.py[WARNING]: Failed running /var/lib/cloud/instance/scripts/part-001 [2]
May 22 21:06:16 cloud-init[1286]: util.py[DEBUG]: Failed running /var/lib/cloud/instance/scripts/part-001 [2]
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/cloudinit/util.py", line 637, in runparts
    subp([exe_path], capture=False, shell=True)
  File "/usr/lib/python2.6/site-packages/cloudinit/util.py", line 1528, in subp
    cmd=args)
ProcessExecutionError: Unexpected error while running command.
Command: ['/var/lib/cloud/instance/scripts/part-001']
Exit code: 2
Reason: -
Stdout: ''
Stderr: ''
Run Code Online (Sandbox Code Playgroud)

如果我使用ssh进入实例并sudo su直接执行shell脚本:

/var/lib/cloud/instance/scripts/part-001
Run Code Online (Sandbox Code Playgroud)

然后运行正常。另外,如果我模拟cloud-init运行它的方式,它也可以工作:

python
>>> import cloudinit.util
>>> cloudinit.util.runparts("/var/lib/cloud/instance/scripts/")
Run Code Online (Sandbox Code Playgroud)

使用任何一种方法,如果我有意将错误引入脚本,则会产生错误消息。如何调试有选择地缺少有用的调试输出的情况?

Rtm*_*tmY 13

不要/var/log/cloud-init.log考虑在内部搜索“失败”、“错误”、“警告”或“/var/lib/cloud/instance/scripts/”等关键字/var/log/cloud-init-output.log- 在大多数情况下,这些关键字包含非常清晰的错误消息。

例如 - 运行错误的命令将在以下位置产生以下错误/var/log/cloud-init-output.log

/var/lib/cloud/instance/scripts/part-001: line 10: vncpasswd: command not found
cp: cannot stat '/lib/systemd/system/vncserver@.service': No such file or directory
sed: can't read /etc/systemd/system/vncserver@.service: No such file or directory
Failed to execute operation: No such file or directory
Failed to start vncserver@:1.service: Unit not found.
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Cleaning repos: amzn2-core amzn2extra-docker amzn2extra-epel
Run Code Online (Sandbox Code Playgroud)

最后/var/log/cloud-init.log您将收到一条安静的一般错误消息:

Aug 31 15:14:00 cloud-init[3532]: util.py[DEBUG]: Failed running /var/lib/cloud/instance/scripts/part-001 [1]
    Traceback (most recent call last):
      File "/usr/lib/python2.7/site-packages/cloudinit/util.py", line 910, in runparts
        subp(prefix + [exe_path], capture=False, shell=True)
      File "/usr/lib/python2.7/site-packages/cloudinit/util.py", line 2105, in subp
        cmd=args)
    ProcessExecutionError: Unexpected error while running command.
    Command: ['/var/lib/cloud/instance/scripts/part-001']
    Exit code: 1
    Reason: -
    Stdout: -
    Stderr: -
    cc_scripts_user.py[WARNING]: Failed to run module scripts-user (scripts in /var/lib/cloud/instance/scripts)
Run Code Online (Sandbox Code Playgroud)

(*) 尝试grep只显示相关错误消息:

grep -C 10 '<search-keyword>' cloud-init-output.log
Run Code Online (Sandbox Code Playgroud)

  • 正是这样做的,但我得到的最清晰的消息是“运行模块[...]失败”。没有理由。没有解释。没有什么。它只是“失败”了。当该消息被声明为警告时,这变得更有趣,而实际上它应该是致命错误,立即终止初始化过程。 (2认同)

jon*_*ive 6

我不确定每个人是否都会遇到这种情况,但是我遇到了这个问题并且能够通过更改我的第一行来解决它:

#!/bin/bash -e -v
Run Code Online (Sandbox Code Playgroud)

就这样:

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

当然,现在我的脚本失败了,我不知道它走了多远,但至少我通过了它而不是运行它。:)

  • 我对 `#!/bin/bash -xe` 遇到了同样的问题 (3认同)
  • 您可以使用以下命令重新添加:set -v -e #verbose 并在出现任何错误时退出,或者:set -x # debug (2认同)

tar*_*ras 5

希望它能减少某人的调试时间。我的 中没有任何明确的错误消息/var/log/cloud-init-output.log,只是这样:

2021-04-07 10:36:57,748 - cc_scripts_user.py[警告]:无法运行模块脚本用户(/var/lib/cloud/instance/scripts 中的脚本) 2021-04-07 10:36:57,748 - util.py[警告]:运行模块脚本用户(<module 'cloudinit.config.cc_scripts_user' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_scripts_user.py'>)失败

经过一番调查,我意识到原因是 shebang 字符串中的拼写错误:#!?bin/bash而不是#!/bin/bash.