【问题标题】:ec2 run scripts every bootec2 每次启动时运行脚本
【发布时间】:2017-08-20 17:27:24
【问题描述】:

我在这里关注了一些帖子,尝试在每次启动后在我的 ec2 实例上运行 python 或 shell 脚本,而不仅仅是第一次启动。

我试过了:

[scripts-user, always] 到 /etc/cloud/cloud.cfg 文件

  • 将脚本添加到 ./scripts/per-boot 文件夹

将脚本添加到 /etc/rc.local

  • 是的,/etc/rc.local 的权限已更改为 755

我正在尝试将文件的输出通过管道传输到位于 /home/ubuntu/ 目录中的文件中,并且该文件在启动后不包含任何内容。

如果我手动运行脚本(.sh 或 .py),它们就可以工作。

有任何建议或要求提供更多信息以提供帮助吗?

【问题讨论】:

    标签: python linux amazon-web-services amazon-ec2


    【解决方案1】:

    这是你想要的吗?

    它将脚本复制到实例,连接到实例,然后立即运行脚本。

    ec2 scp ~/path_to_script.py : instance_name -y && ec2 ssh instance_name -yc "python script_name.py" 1>/dev/null
    

    【讨论】:

    • 我需要将任何软件包下载到我的 EC2 Ubuntu 实例吗?我只在终端运行一次吗?还是每次实例重启时都必须运行它?
    • 您的实例上应该有 Python 和您需要的任何其他东西。您可以从 CLI 运行它。这取决于脚本和它应该完成的任务。如果它只是解决某些问题,它只需要运行一次,这个命令将启动实例并立即运行它。在一个简单的脚本上尝试一下,然后自己看看。
    • 运行您建议的命令后,脚本会在重启后继续运行吗?我的问题是即使在第一次启动后我也需要运行脚本
    • 我将脚本添加到用户数据,但第一次启动后脚本不再运行
    • 那么你需要cron在这种情况下,docs.aws.amazon.com/opsworks/latest/userguide/…
    【解决方案2】:

    我读到 rc.local 的使用已被弃用。要尝试的一件事是 /etc/crontab 中的一行,如下所示:

    @reboot 脚本的完整路径

    如果您要运行脚本的特定用户,您可以在@reboot 之后列出它。

    【讨论】:

    • @reboot 是否位于文件的最后一行?另外,如果我运行一个 shell 脚本,它会是 "@reboot /path/to/file" 吗?或“@reboot sh /path/to/file”?
    • 这需要在实例首次启动时完成吗?或者我可以在第一次发布后的任何时候这样做吗?
    • 我在最后一行对 /etc/crontab 的命令是:@reboot /path/to/file.sh >> /path/to/log.txt 重启后没有在.txt 文件...我认为 crontab 方法不起作用,除非我错过了一个步骤
    • 它不需要在第一次启动时出现,它在 /etc/crontab 中的位置也无关紧要。确保 crond 正在运行,如果您发现它不在启动时,请输入“systemctl enable crond”。
    • 另外,在您的脚本中,指定手动运行脚本时所拥有的 $PATH 可能会有所帮助。例如,在命令行上执行 echo $PATH ... 并在脚本中输出。例如: PATH=/sbin:/bin:/usr/sbin:/usr/bin 我可以想到脚本运行但什么也没做的时候,因为正确路径的环境变量不存在。 ...并且在 /var/log 下应该有一个 cron 日志文件,其中列出了 cron 作业运行的事件。
    【解决方案3】:

    因此,当前的解决方案似乎是我在最初的问题帖子中注销的一种方法,因为我可能没有完全按照下面链接中的大纲执行设置...

    这个链接 --> How do I make cloud-init startup scripts run every time my EC2 instance boots?

    该链接显示如何修改 /etc/cloud/cloud.cfg 文件以将 scripts-user 更新为 [scripts-user, always]

    该链接还表示将您的 *.sh 文件添加到 /var/lib/cloud/scripts/per-boot 目录。

    重新启动系统后,您的脚本应该已经执行,您可以在以下位置进行验证:sudo cat /var/log/cloud-init.log

    如果您的脚本仍然无法执行,请尝试使用以下命令清除服务器的实例状态:sudo rm -rf /var/lib/cloud/instance/*

    --注意:-- 看来来自 python 脚本的打印命令没有像预期的那样通过管道 (>>) 但回显命令很容易管道

    管道失败 sudo python test.py >> log.txt

    管道成功 echo "HI" >> log.txt

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2019-04-07
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多