Я пишу сценарий оболочки в Bash. В какой-то момент сценария он обнаруживает, что перед продолжением необходимо перезагрузить компьютер. Выдает:
sudo reboot
Когда машина возвращается, есть еще работа, которую должен выполнить этот скрипт. Как мне что-то настроить, чтобы продолжить работу в этом скрипте?
Я предполагаю, что есть место, где я могу написать сценарий оболочки, чтобы он выполнялся при следующей перезагрузке. Где такое место? Я вижу, что у cron есть директива @reboot. Я также знаю, что такие службы, как Apache, запускаются при загрузке при помощи upstart. Подойдут ли какие-либо из этих механизмов? Если так, как это будет вызвано?
Этот скрипт нужно запускать только один раз, а не каждую перезагрузку. Так что он должен будет пойти куда-нибудь, что просто запустится при следующей перезагрузке, или сможет удалить себя после запуска.
Этот вопрос спрашивает о том, как сохранить состояние вашего приложения после перезагрузки. В моем сценарии мало состояний, поэтому я могу справиться с этим. Мне просто нужно знать, как заставить этот скрипт запускать что-то после следующей перезагрузки.
Моя конкретная версия - Ubuntu Linux 14.04. Исходный скрипт запускается в командной строке системным администратором (в отличие от запуска из cron).
источник
Ответы:
В системе единственное, что действительно является постоянным, - это файл. Это в значительной степени то, что вы должны использовать. Вот решение с использованием сценария init.d.
Давайте рассмотрим следующий (простой) скрипт
/etc/init.d/myupdate
:Если вы активируете его с помощью
update-rc.d myupdate defaults
,start
действие будет выполнено при загрузке. Теперь, когда ваш скрипт обновления требует перезагрузки:С помощью этого решения вы можете разделить ваш скрипт обновления на две части:
Он выполнит
before_reboot
раздел кода, создаст файл/var/run
и перезагрузится. При загрузке сценарий будет вызван снова, но поскольку файл существует,after_reboot
будет вызываться вместоbefore_reboot
.Обратите внимание, что
update-rc.d
требуются права суперпользователя.Без использования файла (из комментария Стивена Остермиллера ):
Если вы знакомы с
getopts
утилитой, вы можете использовать опции вместо файлов. В скрипте инициализации вызовите скрипт с:И в вашем скрипте проверьте параметры вместо файлов. Вызовите ваш скрипт один раз без опции, и init.d вызовет его снова при загрузке, на этот раз с
-r
.Вы найдете больше информации об обработке опций здесь (только для коротких опций) . Я также отредактировал свой сценарий с вызовами, чтобы
update-rc.d
сохранить это разовую работу (из другого комментария).источник
/path/to/update/script --after-reboot
из ,/etc/init.d/myupdate
а не полагаться на присутствие/var/run/rebooting-for-updates
. Тогда он будет иметь разные аргументы при запуске напрямую по сравнению с вызовом при загрузке.update-rc.d myupdate defaults
иupdate-rc.d myupdate remove
в сам скрипт, а также написание и удаление,/etc/init.d/myupdate
чтобы не оставлять файлы без присмотра.INIT INFO
разделе: wiki.debian.org/LSBInitScripts