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

Rob*_*loi 19 boot scripts amazon-ec2

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

And*_*ovs 16

不。但您可能想将脚本放在 中/etc/init.d/script,然后自行删除它:

#!/bin/bash

echo "Bump! I'm your first-boot script."

# Delete me
rm $0
Run Code Online (Sandbox Code Playgroud)

  • $0 不是特定于 bash 的,并且它的支持时间比 bash 3.x 已经存在的时间要长得多(并且它在 Bourne、Korn、zsh 和其他版本中得到支持)。症结在于 $0 是否包含完整或相对路径规范。如果需要,这是获取完整路径的可靠方法的链接:http://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path对自己 (5认同)

Awi*_*Awi 11

结合前两个答案假设您将脚本命名为/usr/local/bin/firstboot.sh将其放在末尾/etc/rc.local(此脚本在每次启动时运行),脚本如下所示

#!/bin/bash

标志="/var/log/firstboot.log"
如果 [ !-f $标志]; 然后
   #把你的初始化语句放在这里
   echo "这是第一次开机"

   #下一行创建一个空文件,因此它不会在下次启动时运行
   触摸$FLAG
别的
   echo "什么都不做"
菲


Tom*_*Tom 9

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

  • 虽然乍一看似乎并非如此,但这可能是比删除脚本更好的解决方案,因为它保留了再次触发它的可能性,如果您愿意的话。 (7认同)

小智 6

就我而言,它正在构建一个自定义系统,我不得不拒绝使用 cloud-init 并且在下面放置脚本/etc/init.d/script不起作用 - 所以我使用了 systemd。

文件 /etc/systemd/system/firstboot.service

[Unit]
Description=One time boot script
[Service]
Type=simple
ExecStart=/firstboot.sh
[Install]
WantedBy=multi-user.target 
Run Code Online (Sandbox Code Playgroud)

文件/firstboot.sh

[Unit]
Description=One time boot script
[Service]
Type=simple
ExecStart=/firstboot.sh
[Install]
WantedBy=multi-user.target 
Run Code Online (Sandbox Code Playgroud)

然后启用

#!/bin/bash 
SOME COMMANDS YOU WANT TO EXECUTE
systemctl disable firstboot.service 
rm -f /etc/systemd/system/firstboot.service
rm -f /firstboot.sh
Run Code Online (Sandbox Code Playgroud)

这个对我来说效果很好。