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

15

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

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

Ссылка

Я пробовал, что они для выключения, но он не работает.

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

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

любые предложения?

    
задан SERPRO 04.02.2014 в 13:42
источник

6 ответов

11

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

SHUTDOWN_USERS=""

к

SHUTDOWN_USERS="all"

Это исправлено для меня на Ubuntu 14.04

    
ответ дан GaryBishop 03.07.2014 в 13:46
источник
18

Чтобы выполнить сценарий при завершении работы или перезагрузке:

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

Примечания:

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

источник

    
ответ дан Maythux 04.02.2014 в 13:49
10
  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/rc0.d/k99stop_vm /etc/rc6.d/k99stop_vm
    
ответ дан Ravi 04.02.2014 в 15:10
6

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

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

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

Версия GUI

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

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

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

#!/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

Подробнее можно найти по ссылке выше.

Версия командной строки (командной строки)

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

Создать сценарии запуска и завершения работы с первой строкой #!/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 line + WantedBy позволит вам делать более точные различия:

Этот файл был предложен во втором ответе этого сообщения , но мне не удалось запустить его, пока я не добавил раздел «Установка».

Снова отредактируйте скрипт в /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
    
ответ дан John 9631 06.07.2016 в 05:53
2

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

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

Установка

Измените /etc/init.d/vagrant-boxes и вставьте скрипт из предыдущей статьи и сохраните. Или скачать его здесь и сохранить его в /etc/init.d/vagrant-boxes . На debian / ubuntu и т. Д. Запустите

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

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

    
ответ дан milkovsky 14.01.2015 в 08:34
2

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

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

  1. Создайте скрипт в /etc/init.d/scriptName
  2. Ссылка через ln -s /etc/rc6.d/K04scriptName /etc/init.d/scriptName

Шаги, которые я прошел через

  1. Я безуспешно пытался использовать Ubuntu - выполнение сценария в запуск и завершение работы
  2. Я нашел скрипт отключения Ubuntu 14.10 с rc0 .d (rc6.d, rc.d)
  3. Я изменил с /etc/rc6.d/RC99linkName на /etc/rc6.d/RC04linkName и работает
ответ дан Anthony Astige 29.03.2015 в 02:17