仅在第一次启动时运行脚本

Ubuntu中是否有惯用的方法只在第一次启动机器时运行脚本? (EC2)。

不。但您可能希望将脚本放在/etc/init.d/script ,并自行删除它:

 #!/bin/bash echo "Bump! I'm your first-boot script." # Delete me rm $0 

脚本运行时创建跟踪文件。 如果该文件已存在,请退出该脚本。

结合前两个答案假设你将脚本命名为/usr/local/bin/firstboot.sh将它放在/etc/rc.local的末尾(这个脚本在每次启动时运行)脚本就像这样

 #!/斌/庆典

 FLAG = “/无功/日志/ firstboot.log”
如果[!  -f $ FLAG]; 然后
    #Put这里是你的初始化句子
   回声“这是第一次启动”

    #下一行创建一个空文件,因此它不会运行下一次启动
   触摸$ FLAG
其他
   回声“什么都不做”
科幻

我对搜索一个定义良好且支持的Ubuntu“第一次启动”钩子的结果感到惊讶。 好像Red Hat / Fedora / CentOS的人群已经有十多年了。 最接近的Ubuntu等价物似乎是oem-config-firstboot 。

简单地执行rm $0的想法将起作用。 但是,从技术上讲,涉及一些有趣的语义。 与Unix下的大多数其他脚本解释器不同,shell脚本一次读取并处理一行/语句。 如果你从下面取消链接( rm )文件,那么处理该脚本的shell实例现在正在使用匿名文件(任何打开但未链接的文件)。

考虑这样的文件:

 #!/bin/bash rm $0 echo "I've removed myself: $0" ls -l $0 cat < 

如果你把它保存到类似rmself.sh和(硬)链接到tst东西然后运行./tst应该显示类似这样的输出:

 $ ./tst I've removed myself: ./tst ls: ./tst: No such file or directory This is a test. I'm still here, because the "here" doc is being fed to 'cat' via the anonymous file through the open file descriptor. But I cannot be re-exec'd ./tst: line 11: /home/jimd/bin/tst: No such file or directory ./tst: line 11: exec: /home/jimd/bin/tst: cannot execute: No such file or directory 

现在有一些关于符号链接的奇怪可能的极端情况以及脚本被作为一个裸名称调用的情况(强制shell在$PATH搜索脚本)。

但似乎bash (至少在版本3.2中)如果搜索路径,则将路径预先设置为$ 0,否则将$ 0设置为用于调用脚本的相对或绝对路径。 它似乎没有做任何规范化或解析相对路径或符号链接。

对于Ubuntu来说,最干净的“firstboot”可能是创建一个小包(.deb),其中包含一个放在/etc/init.d/firstboot中的脚本和一个安装后脚本,它使用update-rc.d来链接进入运行级别1( /etc/rc1.d )(使用如下命令: update-rc.d firstboot defaults )...然后让最后一行执行取消激活或删除使用类似: update-rc.d firstboot disable

这是Debian update-rc.d HOWTO的链接

您可以将当前rc.local备份到rc.local.bak

然后你可以在rc.local中找到你想要做的东西,最后只需要mv /etc/rc.loca.bak /etc/rc.local。

问题是在第一次启动EC2时运行脚本。 您可以使用cloud-init来实现此目的。

启动新的EC2实例时,您可以选择在Advanced datails User data下定义User data 。 如果您将cloud-init脚本放在那里,它将仅在首次启动时执行。

例如,您可以将以下内容放在User data

 #cloud-config runcmd: - /usr/bin/command1.sh - /usr/bin/command2.sh 

输出将写入/var/log/cloud-init-output.log

Cloud-init可以做的远不止这些。 它专门用于执行云实例的早期初始化。 请参阅此处的文档: http : //cloudinit.readthedocs.io/en/latest/index.html