Виконати сценарій після виходу / перезавантаження / відключення в Ubuntu


30

Я хотів би запустити .shфайл, використовуючи bash при виході та відключенні Ubuntu. Я шукав в Інтернеті вгору та вниз, і знайшов лише виправлення для KDE та GNOME. Сценарій простий, мені просто потрібно знати, чи можу я додати рядок коду до файлу «вихід / вимкнення» або якщо мені потрібно посилатися на нього в іншому сценарії.


1
Покладіть символьні посилання на виконувані файли в /etc/init.d в /etc/rc0.d та /etc/rc6.d
ще один користувач

2
Спробуйте прийняти оновлену відповідь (використовувати systemd), щоб люди бачили її зверху.
Джонатан Ю.

Відповіді:


18

Щоб виконати сценарій при виході:

Додайте наступний рядок:

session-cleanup-script=/path/to/script

у /etc/lightdm/lightdm.confфайл.

Вам потрібно перезапустити lightdm, щоб ця зміна набула чинності. Для цього перейдіть у tty1, використовуючи Ctrl+ Alt+ F1, увійдіть із своїм ім'ям користувача та паролем та виконайте таку команду:

sudo service lightdm restart

Примітка: використовуйте Ctrl+ Alt+ F7для переходу до графічного сеансу

Для виконання сценарію після перезавантаження:

  1. Покладіть свій сценарій /etc/rc0.d
  2. Зробіть його виконуваним: sudo chmod +x K99_script
  3. Примітки:
    • Сценарії в цьому каталозі виконуються в алфавітному порядку.
    • Ім'я вашого сценарію повинно починатись із K99запуску в потрібний час.

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

  1. Покладіть свій сценарій /etc/rc6.d
  2. Зробіть його виконуваним: sudo chmod +x K99_script
  3. Примітки:
    • Сценарії в цьому каталозі виконуються в алфавітному порядку.
    • Ім'я вашого сценарію повинно починатись із K99запуску в потрібний час.

Джерела:


4
Сценарії, що починаються з 'Kill' і 'Start' , умовно називати . KS
кірі

Що робити, якщо сценарію потрібні привілеї sudo? Наскільки я можу сказати, сценарії /etc/rc6.d виконуються як користувач і не можуть використовувати gksudo.
Урхіксидур

1
не працює для мене з 14.04, чи є якась зміна чи не визначений важливий факт?
tomasb

2
Поради K99 не є корисними для вимкнення / перезавантаження, якщо ви хочете зберегти деякі дані, оскільки це відбувається ПІСЛЯ відключення І K використовується для відключення скрипту (див. /Etc/rcS.d/README), використовуйте S для запуску та розмістіть його перед відключенням, для завантаження помістіть свій сценарій після монтування, застрягши на цьому, оскільки ця дезінформація вирішена з S як першої літери
tomasb

6
Це дуже неправильно: i) назви сценаріїв повинні починатися з рівня Kдля запуску 0, 1 і 6, а Sдля рівнів 2, 3, 4 і 5; ii) вам не потрібно викликати скрипт K99_foo, число просто визначає порядок запуску скриптів. Вам потрібно вибрати той, який більший за інші, якщо ви хочете, щоб він був запущений останнім; iii) Runlevel 0 не для перезавантаження! ; Це для відключення. 6 призначений для перезавантаження. iv) сценарії не мають жодної справи в /etc/rcN.dкаталогах. Натомість вони повинні бути /etc/init.dі пов'язані з ними /etc/rcN.d.
тердон

14

Як це зробити з systemd

Якщо ви знайдете цей потік після червня 2016 року, Ubuntu та його похідні, включаючи Mint, будуть використовувати systemd для управління ініціалізацією та відключенням системи. У мене були проблеми зі старим підходом, тому я досліджував системний шлях.

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


Версія 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" дозволить вам зробити чіткіші розрізнення:

Цей файл був запропонований у відповіді на Unix & Linux @Matthias, але мені не вдалося змусити його працювати, поки я не додав розділ 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

1
Хоча ваша публікація правильна, я б запропонував покращити її, додавши приклад того, як такі кроки можна зробити в системах. Будь ласка, повідомте мене, коли ви редагуєте повідомлення. Дякуємо та вітаємо AskUbuntu
Сергій Колодяжний

Привіт Серг, ти маєш на увазі такі приклади, як у пов'язаній публікації, чи ти мав на увазі щось інше? По-друге, я не впевнений, як "повідомити вас", оскільки я не можу знайти механізм для контакту з іншим користувачем SO.
Іван 9631

Так, ви можете навести приклад такий же, як у вашій іншій посаді. Сказати "перейти на інше посилання" не дуже добре, і ваша відповідь виглядає лінивою. Також для контакту з іншим користувачем SO використовуйте @ перед ім'ям користувача, наприклад @Serg
Сергій Колодяжний

Набагато покращився. Дуже добре, продовжуйте гарну роботу!
Сергій Колодяжний

1
відповідно до man systemd.unitстворених користувачем файлів можна розміщувати в $XDG_CONFIG_HOME/systemd/userінших локальних місцях користувачів
Антоніос Хаджігеоргаліс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.