Виконати команду перед відключенням / перезавантаженням [дублікат]


19

У мене машина з парою бродячих ВМ. Проблема, яку я маю, полягає в тому, що іноді я забуваю відключити ці VM перед тим, як вимкнути або перезавантажити машину. Через це моя машина застрягла в цьому повідомленні: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

будь-які пропозиції?


4
Метод у посиланні є дійсним і працює на всіх версіях Linux, тому ваш скрипт неправильний;) Користувач не відомий при відключенні, оскільки це робиться користувачем root. Тому опустіть "~" і зробіть це повним шляхом.
Rinzwind

Це працює? Я слідував за подібним мануелем, як gist.github.com/ymc-geha/8416723, але не працював для мене на ubuntu 14.04
користувач2135804

@ user2135804 Я думав, що це було .. але насправді це не працювало для Vagrant .. Я намагався з іншими речами, і це працювало добре.
SERPRO

1
До речі, помилка, яку ви описуєте, тут .
Гарретт

1
Як видно з звіту про помилки, це було виправлено та буде включено до VirtualBox 4.3.29.
Гарретт

Відповіді:


12

Якщо ваші бродячі віртуальні машини використовують VirtualBox, ви можете змінити / etc / default / virtualbox та змінити рядок, який читає:

SHUTDOWN_USERS=""

до

SHUTDOWN_USERS="all"

Це зафіксувало мене на Ubuntu 14.04


1
Насправді у віртуальній скриньці з цим є відкритий квиток. virtualbox.org/ticket/12264 . Я б запропонував використовувати SHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`замістьSHUTDOWN_USERS="all"
running.t

Я також на Ubuntu 14.04 з Vagrant за допомогою VirtualBox, але я не маю жодного /etc/default/virtualboxфайлу ...
Гаррет

21

Щоб виконати сценарій при відключенні або перезавантаженні:

  1. збережіть свій скрипт у /etc/rc6.d
  2. Зробіть його виконуваним: sudo chmod +x K99_script

Примітки:

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

джерело


1
Справді. Називати його правильно, щоб він працював у потрібний час, дуже важливо.
шивами

2
Я поставив скрипт у /etc/rc6.d і він не працював при відключенні. Я помістив його в /etc/rc0.d і він працював при відключенні. Можливо, rc.6 призначений лише для перезавантаження.
Ерел Сегал-Халеві

2
@Erel Segal-Halevi Я щойно спробував додати сценарій K99 до /etc/rc6.d, і він не виконується. Дивлячись на інші сценарії, є рядок ** жирний код K10reboot -> ../init.d/reboot **, тому схоже, що сценарій K99 НІКОЛИ не буде виконаний !!
Девід Уокер

Відповідь від Раві нижче - кращий вибір, оскільки він використовує символьні посилання, щоб забезпечити виконання сценарію при відключенні та перезавантаженні. Я також думаю, що більшість системних файлів мають тенденцію використовувати цей підхід.
Едді

rc.6 видається лише для перезавантаження, як згадували інші. Дивіться
Aelian

12

Як це зробити з Systemd (це простіше)

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

За допомогою systemd ви створюєте один або два файли для виклику сценаріїв за допомогою наведених нижче шаблонів та виконуєте пару команд. Простий.


Версія GUI

Спочатку створіть сценарії, які потрібно запустити при запуску та / або вимкненні. Просто зробіть одну, якщо вам не потрібно обох. Я створив .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 перезапуск запуску

Більше можна знайти за посиланням вище.



Версія CLI (командного рядка)

Цей опис передбачає, що ви працюєте з домашнього каталогу, а не / 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їх можна використовувати для моніторингу нових служб.



Зміна умов тригера для вимкнення

Файли перш за все використовують відкрите або закрите багатокористувацьке середовище для ініціювання запуску скриптів. У наведеному нижче файлі використовується початок чотирьох потенційних процесів відключення для ініціювання його сценаріїв. Додавання або видалення цілей у рядку "Перед" + рядок "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

7
легше? простіше, ніж що? простіше, ніж піднятися на Еверест? будь-яке інше рішення, розміщене тут, простіше, ніж це ...
Fran Marzoa

1
Нічого так, це повна і гідно написана відповідь, і що кожен повинен робити - проблеми з називанням /etc/rc6.d та плутанина свідчать про те, що це не гарні відповіді. Якщо процедура проста, то вона не обов'язково має сили для безпечного досягнення її кінця. Дивіться розділ [Встановити] - ви можете бути впевнені, що ваш сценарій буде виконаний у потрібний час. Крім того, оскільки відповідь довга, це не означає, що її складний! Дякую btw, John9631, ця відповідь ідеальна і буде неоціненною у створенні безпечних та ефективних сценаріїв у критичний момент місії ...
мельник горили

11
  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>

chmodзмінює прапорці дозволу цілі посилання, що однаково для обох аргументів. Вказання їх обох зайве.
Девід Фоерстер

2

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

Існує простий скрипт init, який призупиняє всі запущені поля перед вимкненням.

Установка

Відредагуйте /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

Для Ubuntu 14.10 ви щось подібне RC04немає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, і це працює
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.