Запускать скрипт только при первой загрузке

Есть ли в Ubuntu идиоматический способ запуска скрипта только при первой загрузке машины? (EC2).

12
задан 28 June 2012 в 03:12

6 ответов

Нет. Но Вы могли бы хотеть поместить свой сценарий в /etc/init.d/script, и самоудалите его:

#!/bin/bash

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

# Delete me
rm $0
14
ответ дан 28 June 2012 в 03:12

Вы можете сделать резервную копию текущего rc.local на rc.local.bak

Затем вы можете получить то, что вы хотите сделать в rc.local, а в конце просто mv /etc/rc.loca.bak /etc/rc.local.

0
ответ дан 28 June 2012 в 03:12

Я удивлен результатами, я вижу поиск четко определенной и поддерживаемой 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

3
ответ дан 28 June 2012 в 03:12

Создайте файл отслеживания при запуске скрипта. Если файл уже существует, выйдите из сценария.

0
ответ дан 28 June 2012 в 03:12

Объединение первых двух ответов. Предполагая, что вы называете свой сценарий /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
0
ответ дан 28 June 2012 в 03:12

Вопрос был о запуске скрипта при первой загрузке 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
ответ дан 28 June 2012 в 03:12

Другие вопросы по тегам:

Похожие вопросы: