Есть ли в Ubuntu идиоматический способ запуска скрипта только при первой загрузке машины? (EC2).
Нет. Но Вы могли бы хотеть поместить свой сценарий в /etc/init.d/script
, и самоудалите его:
#!/bin/bash
echo "Bump! I'm your first-boot script."
# Delete me
rm $0
Вы можете сделать резервную копию текущего rc.local на rc.local.bak
Затем вы можете получить то, что вы хотите сделать в rc.local, а в конце просто mv /etc/rc.loca.bak /etc/rc.local.
Я удивлен результатами, я вижу поиск четко определенной и поддерживаемой Ubuntu, "сначала загружают" рычаг. Походит на Red Hat / Fedora / толпа CentOS имела, это закрепило больше десятилетия. Самая близкая эквивалентная Ubuntu, кажется, oem-config-firstboot.
Идея простого выполнения rm $0
будет работать. Но, технически существует некоторая интересная включенная семантика. В отличие от большинства других интерпретаторов сценария под Unix сценарий оболочки прочитан и обработал одну строку/оператор за один раз. Если Вы удаляете связь (rm
) файл из-под него затем, что экземпляр оболочки это обрабатывает тот сценарий, теперь работает с анонимным файлом (любой файл, это является открытым, но несвязанным).
Рассмотрите файл как это:
#!/bin/bash
rm $0
echo "I've removed myself: $0"
ls -l $0
cat <<COMMENTARY
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
COMMENTARY
exec $0
Если Вы сохраняете это к чему-то как 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
Теперь существуют некоторые нечетные возможные угловые случаи относительно символьных ссылок и случаи, где сценарий был вызван как пустое имя (вынуждающий оболочку искать $PATH
для сценария.
Но это кажется этим bash
(по крайней мере, в версии 3.2), предварительно ожидает $0
с путем, если это искало путь и иначе оставляет набор за 0$ любому относительному или полному пути, использовался для вызова сценария. Это, кажется, не делает относительных путей нормализации или разрешения, ни символьных ссылок.
Вероятно, самый чистый "firstboot" для Ubuntu должен был бы создать небольшой пакет (.deb) содержащий сценарий, который будет помещен в /etc/init.d/firstboot
и сценарий постустановки, который использует update-rc.d
связать это в runlevel 1 (/etc/rc1.d
) (использование команды как: update-rc.d firstboot defaults
)... и затем имейте последнюю строку, выполняют деактивацию или удаляют использование чего-то как: update-rc.d firstboot disable
Вот ссылка на ПРАКТИЧЕСКОЕ РУКОВОДСТВО обновления-rc.d Debian
Создайте файл отслеживания при запуске скрипта. Если файл уже существует, выйдите из сценария.
Объединение первых двух ответов. Предполагая, что вы называете свой сценарий /usr/local/bin/firstboot.sh
, поместите его в конце /etc/rc.local
(этот сценарий запускается при каждой загрузке), сценарии выглядят так
#!/bin/bash FLAG="/var/log/firstboot.log" if [ ! -f $FLAG ]; then #Put here your initialization sentences echo "This is the first boot" #the next line creates an empty file so it won't run the next boot touch $FLAG else echo "Do nothing" fi
Вопрос был о запуске скрипта при первой загрузке EC2. Вы можете использовать cloud-init
для этой цели.
При запуске нового экземпляра EC2 у вас есть возможность определить User data
в Advanced datails
. Если вы поместите туда скрипт 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