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

12

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

задан Roberto Aloi 27.06.2012 в 15:58
источник

6 ответов

14

Нет. Но вы можете захотеть разместить свой скрипт в /etc/init.d/script и самостоятельно удалить его:

#!/bin/bash

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

# Delete me
rm $0
    
ответ дан Andrejs Cainikovs 27.06.2012 в 16:06
источник
7

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

ответ дан Tom 27.06.2012 в 16:10
7

Объединяя первые два ответа Предполагая, что вы назовете свой скрипт /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
    
ответ дан Awi 27.06.2012 в 23:33
2

Я удивлен результатами, которые я вижу для поиска хорошо определенного и поддерживаемого 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 , чтобы связать это с уровнем выполнения 1 ( /etc/rc1.d ) (используя команду, например: update-rc.d firstboot defaults ) ... и затем последняя строка выполняет деактивацию или удаление, используя что-то вроде: update-rc.d firstboot disable

Вот ссылка на Debian update-rc.d HOWTO

    
ответ дан Jim Dennis 24.02.2015 в 22:10
0

Вопрос заключался в том, чтобы запустить скрипт при первой загрузке 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 может сделать гораздо больше. Он разработан специально для ранней инициализации облачных объектов. См. Документы здесь: Ссылка

    
ответ дан Dima L. 26.04.2018 в 16:18
0

Вы можете скопировать текущий rc.local в rc.local.bak

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

    
ответ дан lmojzis 27.02.2017 в 03:52