Выполнить команду перед выключением / перезагрузкой

У меня есть машина с парой бродячих виртуальных машин. У меня проблема в том, что иногда я забываю отключить эти виртуальные машины перед тем, как выключить или перезагрузить компьютер. Из-за этого моя машина застряла с этим сообщением: waiting for vboxnet0 to become free

Я искал решения и нашел эту страницу:

http://en.kioskea.net/faq / 3348-ubuntu-executing-a-script-at-startup-and-shutdown

Я пытался отключить их, но это не сработало.

Я написал файл sh для этой команды:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

есть предложения?

24
задан 4 February 2014 в 17:42

6 ответов

Если ваши бродячие ВМ используют VirtualBox, вы можете изменить /etc/default/virtualbox и поменять строку, которая гласит:

SHUTDOWN_USERS=""

на

SHUTDOWN_USERS="all"

Что исправило это для меня на Ubuntu 14. 04.

13
ответ дан 4 February 2014 в 17:42

Для выполнения скрипта при выключении или перезагрузке:

  1. сохраните скрипт в файле /etc/rc6.d
  2. Сделайте его исполняемым: sudo chmod +x K99_script

Notes:

  • Скрипт в rc6.d должен быть без расширения .sh
  • Название вашего скрипта должно начинаться с K99, чтобы запустить его в нужное время.
  • Скрипты в этом каталоге выполняются в алфавитном порядке.

source

25
ответ дан 4 February 2014 в 17:42
  1. Создайте исполняемый файл оболочки со своим скриптом в каталоге /etc/init.d/.

  2. Так как это должно быть выполнено во время выключения или перезагрузки, необходимо создать софт-ссылки в /etc/rc0.d/ и /etc/rc6.d

Пример:

sudo ln -s /etc/init.d/<your_file> /etc/rc0.d/k99stop_vm
sudo ln -s /etc/init.d/<your_file> /etc/rc6.d/k99stop_vm
sudo chmod a+x /etc/init.d/<your_file>
12
ответ дан 4 February 2014 в 17:42

Вы можете найти решение здесь: Приостановить / возобновить все блоки Vagrant при выключении / запуске системы .

Существует простой сценарий инициализации, который приостанавливает все

Установка

Отредактируйте /etc/init.d/vagrant-boxes , вставьте скрипт из статьи выше и сохраните. Или загрузите его отсюда и сохраните в /etc/init.d/vagrant-boxes . В debian / ubuntu и т. Д. Запустите

# update-rc.d vagrant-boxes defaults 99 01

. Номер 99 - это порядковый номер, который должен быть больше (в моем случае Virtualbox номер 20, который, кстати, установлен по умолчанию в дистрибутивах Debian). Второе число - это последовательность выключения компьютера. Так что, возможно, сначала будет полезно сделать это.

2
ответ дан 4 February 2014 в 17:42

Как это сделать с помощью Systemd (это проще)

Теперь, когда варианты Ubuntu и Mint перешли на systemd, я обнаружил, что мои старые решения, основанные на вышеизложенном, были менее удовлетворительными. Я искал в интернете, чтобы выяснить, как это сделать с помощью systemd, и в итоге объединил чужую мудрость и задокументировал ее как пост в блоге на blogspot.com.au , содержащий следующий учебник.

С помощью systemd вы создаете один или два файла для вызова ваших скриптов, используя приведенные ниже шаблоны, и выполняете пару команд. Простой.


Версия графического интерфейса

Сначала создайте сценарии, которые вы хотите запускать при запуске и / или завершении работы. Просто сделайте один, если вам не нужны оба. Я создал .scopening_atstart и .scfullcopy_atend.

Затем убедитесь, что они оба исполняемые, щелкнув правой кнопкой мыши файл, выбрав свойства и убедившись, что в соответствии с разрешениями вы отметили «Разрешить выполнение файла как программы».

enter image description here

Два созданных мною файла заполняют и сохраняют содержимое виртуального диска. Они также создают файл в моем домашнем каталоге, чтобы доказать, что служба работает. Они имели вид:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Затем Я открыл свой файловый менеджер от имени пользователя root, открыл /etc/systemd/system и создал файл startup.service и файл save-ramdisk.service. Очевидно, что вы можете выбрать свои собственные имена, и общие имена могли включать файл запуска с именем johns_start.service и файл завершения работы с именем johns_shutdown.service. Только не выбирайте имена существующих сервисов.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

и

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

Вы можете использовать одни и те же служебные файлы, заменяя полный путь вашего исполняемого скрипта для моего.

Наконец для каждой из них выполните команду systemctl enable your_files_name (но без службы суффиксов). Итак, мой первый был systemctl enable startup

Перезагрузите компьютер один раз, чтобы запустить службы. Служба запуска будет выполняться всякий раз, когда systemd входит в многопользовательскую цель, и службу остановки, когда она выходит из многопользовательской цели. Альтернативные служебные файлы с различными условиями активации будут описаны ниже.

Дополнительные полезные команды включают в себя:

запуск systemctl с включенным включением
запуск systemctl с активным включением
запуск при перезагрузке systemctl

Дополнительные сведения можно найти по адресу ссылка выше.



CLI (командная строка) версия

В этом описании предполагается, что вы работаете из своего домашнего каталога, а не / home / john, используете sudo по мере необходимости и ваш выбор редактора, где я напиши vim или свим.

Создать сценарии оболочки запуска и завершения работы с первой строкой #!/bin/sh и сделать их исполняемыми с помощью chmod +x my_new_filename.

Создайте два файла, как указано выше, или в этом примере один файл для обработки задач запуска и завершения работы. Я буду выполнять скрипты в своем домашнем каталоге, но @don_crissti показывает некоторые альтернативы на Stack Exchange .

svim /etc/systemd/system/start_and_stop.service

и скопируйте содержимое файла:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Затем Включите службу с помощью команды:

systemctl enable start_and_stop

и перезагрузите систему после какие услуги будут активны. Команды systemctl is-enabled start_and_stop и systemctl is-active start_and_stop могут использоваться для мониторинга ваших новых сервисов.



Изменение условий запуска для выключения

Прежде всего файлы используют открытие или закрытие многопользовательской среды для запуска сценариев. Файл ниже использует начало четырех возможных процессов выключения для запуска своих сценариев. Добавление или удаление целей в строке Before + строка WantedBy позволит вам сделать более тонкие различия:

Этот файл был предложен во втором ответе этого поста , но я не смог его получить работать до тех пор, пока я не добавлю раздел Install.

Снова отредактируйте скрипт в /etc/systemd/service/ и включите его, используя systemctl enable your_file_name. Когда я изменил цели, я использовал команду systemclt disable file_name, а затем снова включил ее, что связало ее с целевыми каталогами. Перезагрузитесь, и служба будет работать.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target
0
ответ дан 4 February 2014 в 17:42

Для Ubuntu 14.10 вам нужно что-то вроде RC04 не RC99

Что делать с нуля

  1. Создайте сценарий в / etc / init .d / scriptName
    • Убедитесь, что #! / bin / bash находится в верхней части сценария, чтобы Linux знал, что это сценарий Bash
    • Убедитесь, что вы запустили chmod + x /etc/init.d/scriptName[1223 impression, чтобы сделать скрипт исполняемым
  2. Сделать символическую ссылку: ln -s /etc/init.d/[11120518 sizesscriptName / etc /rc6.d/K04[11120520 visiblescriptName[1225 visibleSteps, которые я прошел

    1. Я безуспешно пытался использовать Ubuntu - Выполнение скрипта при запуске и завершении работы
    2. Я обнаружил скрипт завершения работы Ubuntu 14.10 с rc0.d (rc6.d, rc.d)
    3. Я изменил с /etc/rc6.d/RC99linkName на /etc/rc6.d/RC04linkName , и он работает
5
ответ дан 4 February 2014 в 17:42

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

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