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

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

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

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

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

53 ответа

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

#!/bin/bash

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

# Delete me
rm $0
14
ответ дан 25 July 2018 в 18:17

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

#!/bin/bash

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

# Delete me
rm $0
14
ответ дан 31 July 2018 в 10:44

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

#!/bin/bash

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

# Delete me
rm $0
14
ответ дан 2 August 2018 в 00:30

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

#!/bin/bash

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

# Delete me
rm $0
14
ответ дан 4 August 2018 в 15:59

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

#!/bin/bash

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

# Delete me
rm $0
14
ответ дан 6 August 2018 в 00:37

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

#!/bin/bash

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

# Delete me
rm $0
14
ответ дан 7 August 2018 в 18:03

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

#!/bin/bash

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

# Delete me
rm $0
14
ответ дан 10 August 2018 в 06:51

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

#!/bin/bash

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

# Delete me
rm $0
14
ответ дан 15 August 2018 в 18:47
  • 1
    Обратите внимание, что $0 зависит от bash (версия & gt; = 3). Для совместимости вы можете вместо этого указать имя файла скрипта, сделав его менее общим: rm /etc/init.d/script – Andrejs Cainikovs 27 June 2012 в 21:07
  • 2
    $ 0 НЕ относится к bash и поддерживается намного дольше, чем bash 3.x (и поддерживается в Bourne, Korn, zsh и других). Камнем преткновения является то, содержит ли $ 0 полную или относительную спецификацию пути. Вот ссылка на надежный способ получения полного пути, если он вам нужен: stackoverflow.com/questions/4774054/… – Jim Dennis 24 February 2015 в 23:50

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

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

Объединение первых двух ответов Предполагая, что вы назовете свой скрипт /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
ответ дан 25 May 2018 в 09:36
  • 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 должен показать что-то вроде этого как вывод: [ ! d4]

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

Вот ссылка на oem-config-firstboot

2
ответ дан 25 May 2018 в 09:36

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

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

0
ответ дан 25 May 2018 в 09:36

Вопрос заключался в том, чтобы запустить скрипт при первой загрузке 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
ответ дан 25 May 2018 в 09:36

Вопрос был о запуске скрипта при первой загрузке EC2. Вы можете использовать cloud-init для этой цели.

При запуске нового экземпляра EC2 у вас есть возможность определить User data в Advanced datails. Если вы поместите туда скрипт cloud-init, он будет выполнен только при первой загрузке.

Например, вы можете поместить в User data следующее: записаться в /var/log/cloud-init-output.log

Cloud-init может сделать гораздо больше, чем это. Он разработан специально для ранней инициализации облачных экземпляров. Смотрите документы здесь: http://cloudinit.readthedocs.io/en/latest/index.html

0
ответ дан 25 July 2018 в 18:17

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

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

0
ответ дан 25 July 2018 в 18:17

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

7
ответ дан 25 July 2018 в 18:17

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

7
ответ дан 25 July 2018 в 18:17

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

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

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

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

0
ответ дан 31 July 2018 в 10:44

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

7
ответ дан 31 July 2018 в 10:44

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

7
ответ дан 31 July 2018 в 10:44

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

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

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

0
ответ дан 2 August 2018 в 00:30

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

7
ответ дан 2 August 2018 в 00:30

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

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

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

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

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

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

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

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

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

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