Есть ли в Ubuntu идиоматический способ запуска скрипта только при первой загрузке машины? (EC2).
Есть ли в 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
(эти скрипты запускаются при каждой загрузке).
#! / Bin / Баш FLAG = "/ Var / Журнал / firstboot.log" если [ ! -f $ FLAG]; тогда # Поместите здесь ваши предложения инициализации echo "Это первая загрузка" # следующая строка создает пустой файл, поэтому он не будет запускаться при следующей загрузке коснитесь $ FLAG еще эхо "Ничего не делать" фи
Я удивлен результатами, которые я вижу при поиске четко определенного и поддерживаемого хука 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 установленным для любого относительного или абсолютного пути, использованного для вызова скрипта. Кажется, он не делает ни нормализации или разрешения относительных путей, ни символических ссылок.
Вероятно, самой чистой «первой загрузкой» для Ubuntu было бы создать небольшой пакет (.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
Вопрос был о запуске скрипта при первой загрузке 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
$0
зависит от bash (версия> = 3). В целях совместимости вы можете вместо этогоrm /etc/init.d/script