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

Вопрос в том, как вернуться к Ubuntu из Kubuntu, затем установить LXDE, а затем:

http://www.psychocats.net/ubuntu/purelxde

Если вы были желая просто Ubuntu: http://www.psychocats.net/ubuntu/purelxde

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

53 ответа

Вопрос был о запуске скрипта при первой загрузке 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
ответ дан 4 August 2018 в 15:59

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

2
ответ дан 4 August 2018 в 15:59

Объединение первых двух ответов. Предполагая, что вы называете свой скрипт, /usr/local/bin/firstboot.sh ставьте его в конце /etc/rc.local (этот скрипт запускается при каждой загрузке).

7
ответ дан 4 August 2018 в 15:59

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

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

0
ответ дан 6 August 2018 в 00:37

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

7
ответ дан 6 August 2018 в 00:37

Вопрос был о запуске скрипта при первой загрузке 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
ответ дан 6 August 2018 в 00:37

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

2
ответ дан 6 August 2018 в 00:37

Объединение первых двух ответов. Предполагая, что вы называете свой скрипт, /usr/local/bin/firstboot.sh ставьте его в конце /etc/rc.local (этот скрипт запускается при каждой загрузке).

7
ответ дан 6 August 2018 в 00:37

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

7
ответ дан 7 August 2018 в 18:03

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

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

0
ответ дан 7 August 2018 в 18:03

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

Объединение первых двух ответов. Предполагая, что вы называете свой скрипт, /usr/local/bin/firstboot.sh ставьте его в конце /etc/rc.local (этот скрипт запускается при каждой загрузке).

7
ответ дан 7 August 2018 в 18:03

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

2
ответ дан 7 August 2018 в 18:03

Вопрос был о запуске скрипта при первой загрузке 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
ответ дан 10 August 2018 в 06:51

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

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

0
ответ дан 10 August 2018 в 06:51

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

7
ответ дан 10 August 2018 в 06:51

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

2
ответ дан 10 August 2018 в 06:51

Объединение первых двух ответов. Предполагая, что вы называете свой скрипт /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
7
ответ дан 10 August 2018 в 06:51

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

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

0
ответ дан 15 August 2018 в 18:47

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

7
ответ дан 15 August 2018 в 18:47
  • 1
    Хотя на первый взгляд это может показаться не таким, но это может быть лучшим решением, чем удаление сценария, поскольку у него есть возможность запустить его снова, если вы захотите. – msanford 8 May 2014 в 19:43

Вопрос был о запуске скрипта при первой загрузке 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
ответ дан 15 August 2018 в 18:47

Объединение первых двух ответов. Предполагая, что вы называете свой скрипт, /usr/local/bin/firstboot.sh ставьте его в конце /etc/rc.local (этот скрипт запускается при каждой загрузке).

7
ответ дан 15 August 2018 в 18:47
  • 1
    Это не обязательно работает с sysmtemd. Мне нужно добавить сон 20, чтобы убедиться, что это последний запуск скрипта. – mrossi 2 December 2016 в 23:34

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

2
ответ дан 15 August 2018 в 18:47

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

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