У меня есть машина с парой бродячих виртуальных машин. У меня проблема в том, что иногда я забываю отключить эти виртуальные машины перед тем, как выключить или перезагрузить компьютер. Из-за этого моя машина застряла с этим сообщением: 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
есть предложения?
Если ваши бродячие ВМ используют VirtualBox, вы можете изменить /etc/default/virtualbox
и поменять строку, которая гласит:
SHUTDOWN_USERS=""
на
SHUTDOWN_USERS="all"
Что исправило это для меня на Ubuntu 14. 04.
Для выполнения скрипта при выключении или перезагрузке:
sudo chmod +x K99_script
Notes:
Создайте исполняемый файл оболочки со своим скриптом в каталоге /etc/init.d/.
Так как это должно быть выполнено во время выключения или перезагрузки, необходимо создать софт-ссылки в /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>
Вы можете найти решение здесь: Приостановить / возобновить все блоки 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). Второе число - это последовательность выключения компьютера. Так что, возможно, сначала будет полезно сделать это.
Теперь, когда варианты Ubuntu и Mint перешли на systemd, я обнаружил, что мои старые решения, основанные на вышеизложенном, были менее удовлетворительными. Я искал в интернете, чтобы выяснить, как это сделать с помощью systemd, и в итоге объединил чужую мудрость и задокументировал ее как пост в блоге на blogspot.com.au , содержащий следующий учебник.
С помощью systemd вы создаете один или два файла для вызова ваших скриптов, используя приведенные ниже шаблоны, и выполняете пару команд. Простой.
Сначала создайте сценарии, которые вы хотите запускать при запуске и / или завершении работы. Просто сделайте один, если вам не нужны оба. Я создал .scopening_atstart и .scfullcopy_atend.
Затем убедитесь, что они оба исполняемые, щелкнув правой кнопкой мыши файл, выбрав свойства и убедившись, что в соответствии с разрешениями вы отметили «Разрешить выполнение файла как программы».
Два созданных мною файла заполняют и сохраняют содержимое виртуального диска. Они также создают файл в моем домашнем каталоге, чтобы доказать, что служба работает. Они имели вид:
#!/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 или свим.
Создать сценарии оболочки запуска и завершения работы с первой строкой #!/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
Для Ubuntu 14.10 вам нужно что-то вроде RC04
не RC99
Что делать с нуля
/ etc / init .d / scriptName
#! / bin / bash
находится в верхней части сценария, чтобы Linux знал, что это сценарий Bash chmod + x /etc/init.d/scriptName[1223 impression, чтобы сделать скрипт исполняемым
ln -s /etc/init.d/[11120518 sizesscriptName / etc /rc6.d/K04[11120520 visiblescriptName[1225 visibleSteps, которые я прошел
- Я безуспешно пытался использовать Ubuntu - Выполнение скрипта при запуске и завершении работы
- Я обнаружил скрипт завершения работы Ubuntu 14.10 с rc0.d (rc6.d, rc.d)
- Я изменил с
/etc/rc6.d/RC99linkName
на /etc/rc6.d/RC04linkName
, и он работает