Linux скрипт при выключении

Обновлено: 04.07.2024

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

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

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

В самом деле. Именование его правильно, так что он работает в нужное время, очень важно. – shivams 9 May 2015 в 14:01 Я поместил скрипт в /etc/rc6.d, и он не запускался при завершении работы. Я положил его в /etc/rc0.d, и он запустился при завершении работы. Вероятно, rc.6 предназначен только для перезагрузки. – Erel Segal-Halevi 29 October 2015 в 21:24 @Erel Segal-Halevi Я просто попробовал добавить скрипт K99 в /etc/rc6.d, и он не выполнялся. Если посмотреть на другие скрипты, есть строка ** bold K10reboot - & gt; ../init.d/reboot **, так что он выглядит как скрипт K99 НИКОГДА не будет выполнен !! – David Walker 17 July 2016 в 12:06 Создайте исполняемый файл оболочки с вашим скриптом в каталоге /etc/init.d/. Поскольку это должно быть выполнено во время выключения или перезагрузки, необходимо создать программные ссылки в /etc/rc0.d/ и /etc/rc6.d chmod изменяет флаги разрешений целевой ссылки, что одинаково для обоих аргументов. Указание их обоих является избыточным. – David Foerster 15 October 2014 в 06:36

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

Версия GUI

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

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

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

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

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

Затем для каждого из них выполните команду systemctl, чтобы включить имя_файла_имя (но без службы суффиксов). Итак, мой первый был systemctl enable startup

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

Дополнительные полезные команды:

systemctl включен запуск systemctl is-active startup systemctl restart startup

CLI (Command Line) Version

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

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

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

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

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

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

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

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

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

Я хотел бы запустить .sh файл, используя bash при выходе из системы и выключении Ubuntu. Я искал в Интернете и нашел только исправления для KDE и GNOME. Сценарий прост, мне просто нужно знать, могу ли я добавить строку кода в файл "logoff/shutdown" или мне нужно сослаться на нее в другом сценарии.

2 ответа

Чтобы выполнить скрипт при выходе из системы:

Добавьте следующую строку:

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

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

Примечание: используйте 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 бежать в нужное время.

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

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

Версия GUI

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Этот файл был предложен @Matthias в Unix & Linux ответом, но я не смог его запустить, пока не добавил раздел "Установка".

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

В какие места можно кинуть скрипт/команду, чтобы они исполнялись при выключении/включении и перед ждущим/спящим режимами и после выхода из них? Кидал в /etc/rc.local, /etc/default/hal, /etc/pm/sleep.d/ и /usr/lib/pm-utils/sleep.d - не работает. Выполнить нужно две команды


смотри в сторону systemd скриптов. Например перед гибернацией выполнить комманду можно примерно так

к сожалению еще сам не проверял. У меня работает перед выключением(shutdown.target) примерно тоже самое


Подредактировал название и шапку.


Команду добавил в шапку. Куда её кинуть?

что за ddccontrol? в любом случае нужно помнить что в ExecStart= нужно прописывать полные пути. В твоем случае команду нужно запустить скорее всего через шелл. (пути у меня на федоре)


Команда управления монитором. ExecStart= - что это? Можно попроще, я только учусь.

KOT040188 ★★ ( 20.07.16 16:52:28 )
Последнее исправление: KOT040188 20.07.16 16:53:57 (всего исправлений: 2)


Пробовал это - не работает.

- твои скрипты должны лежать в /etc/systemd/system. Посмотри какой нибудь в nano или с cat, чтобы увидеть как они устроенны.

в моем примере видишь 3 раздела. В разделе [Service] execstart выполняет твою команду. Тип oneshot я выбрал сам, вероятно наиболее подходящий. Многие команды выполняются корректно в таком стиле как я написал через sh, но пути всегда должны быть абсолютными. Поищи где находится твоя команда

- после написания скрипта сделать systemctl daemon-reload если хочешь его потестить сразу

- сделать systemctl enable твой_скрипт.service чтобы он проинсталлировался

KOT040188 xa, прикольная штука :))) Обалдеть, очень нужная вещь, я только что свой так выключил. Молодец, где откопал?


На просторах интернета. Причём очень давно. Но авторы забили на неё в 2006 году и её не было в источниках. В 16.04 внезапно добавили в источники. Кстати есть gddccontrol - использовать не советую - глючная до безобразия…

KOT040188 ★★ ( 20.07.16 17:21:48 )
Последнее исправление: KOT040188 20.07.16 17:22:45 (всего исправлений: 1)

спасибо, действительно интересная вещь. А ты уверен что команда правильная? у меня выглядит так

не подкаталоги, у меня такой путь

работающий скрипт у меня



да точно тут. Должен огорчить, у меня после перезагрузки ddccontrol больше не видит ни одного монитора. Переустановка помогает, но это не выход. Видимо еще сырой. Поищу еще, может есть решение.


Короче нифига не понял куда класть…


У меня gddccontrol постоянно теряет монитор и при этом меняет настройки как захочет. Но ddccontrol работает чётко… Он не сырой, он брошеннный…

KOT040188 ★★ ( 20.07.16 17:39:13 )
Последнее исправление: KOT040188 20.07.16 17:39:37 (всего исправлений: 1)

мой скрипт называется monitor.service и должен лежать по этому пути

это пути для кастомных скриптов, которые мы сами создаем

ура, вопрос решился с ddccontrol. Надо подгружать в ядро модуль i2c и мониторы опять распознаются


А, понял. Так это для какого случая - загрузка выключение или спячка? А на бубунте не надо подгружать модули…

KOT040188 ★★ ( 20.07.16 18:01:56 )
Последнее исправление: KOT040188 20.07.16 18:02:57 (всего исправлений: 1)


так там же тоже написано

посмотри точно у тебе после рестарта распознает монитор?

оказалось у меня shutdown.target не срабатывал, надо добавить 2 других. В твоем случае наверно еще hibernate.target и еще там что есть. У меня не активирована гибернация, потому действую вслепую

окончательный вид скрипта такой


В Ubuntu 15.10 и старше лично мне не потребовалось, всё работает из коробки

посмотри точно у тебе после рестарта распознает монитор?

А для выхода из сна, спящего и включения системы какие слова писать? Усыпил - не сработало. Может перезагрузится надо?

KOT040188 ★★ ( 20.07.16 18:21:24 )
Последнее исправление: KOT040188 20.07.16 18:29:46 (всего исправлений: 5)

а ты свой монитор в гибернацию отправляешь? Мой автоматически уходит, когда нет сигнала. После выключения безполезно что либо запускать. Наверно. Еще не пробовал


Выключил - не сработало.


Гибернация это мигающая лампочка, а я выключаю монитор совсем. После выключения нужная команда включает монитор - проверено. Почему не работает скрипт? Я что-то упустил? Что-то я не узнаю linux…

KOT040188 ★★ ( 20.07.16 18:34:53 )
Последнее исправление: KOT040188 20.07.16 18:37:58 (всего исправлений: 2)

и еще вывод команды

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


$ systemctl list-units --type target --all UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System bluetooth.target loaded active active Bluetooth cryptsetup.target loaded active active Encrypted Volumes emergency.target loaded inactive dead Emergency Mode final.target loaded inactive dead Final Step getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface halt.target loaded inactive dead Halt local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems mail-transport-agent.target loaded active active Mail Transport Agent multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network-pre.target loaded inactive dead Network (Pre) network.target loaded active active Network nss-lookup.target loaded inactive dead Host and Network Name Lookups nss-user-lookup.target loaded active active User and Group Name Lookups paths.target loaded active active Paths reboot.target loaded inactive dead Reboot remote-fs-pre.target loaded active active Remote File Systems (Pre) remote-fs.target loaded active active Remote File Systems rescue.target loaded inactive dead Rescue Mode

Надо еще сделать systemctl enable asdfsdfs.service


Блин, вот это я упустил…

KOT040188 ★★ ( 20.07.16 18:44:46 )
Последнее исправление: KOT040188 20.07.16 18:47:11 (всего исправлений: 2) сначала так должен вырубиться. Постоянно выключать комп же невозможно

напомню после каждого изменения скрипта, если хочешь тестировать сразу надо сделать


init.d Скрипты автозапуска при включении, выключении системы.

Скрипты запускаемых служб в Linux Ubuntu располагаются в /etc/init.d

Для того, чтобы скрипт запускался автоматически во время запуска системы, надо создать символическую ссылку на скрипт и разместить её в каталоге /etc/rc.d/rcN.d, где N уровень выполнения скрипта.

Уровень 0

остановка системы (halt) - работа системы должна быть прекращена.

Уровень 1

однопользовательский режим работы - консоль восстановления.

Уровень 2

многопользовательский режим - пользователи могут работать на разных терминалах.

Уровень 3

многопользовательский сетевой режим - осуществляется настройка сети и запускаются сетевые службы.

Уровень 4

практически не используется.

Уровень 5

запуск графической подсистемы X11 - вход в систему осуществляется уже в графическом режиме.

Уровень 6

перезагрузка системы - останавливаются все запущенные программы и производится перезагрузка.

Чаще всего во время загрузки системы используются уровни загрузки 3 или 5.

Имя ссылки в каталоге /etc/rc.d/rcN.d имеет особый смысл, например: если сыылки /etc/rc.d/rcN.d/@K99cpu_t и /etc/rc.d/rcN.d/@S00cpu_t указывают на один и тот же файл /etc/init.d/cpu_t, то скрипт @K99cpu_t будет выполнять в cpu_t блок кода, соответствующий останову системы, а скрипт @S00cpu_t будет выполнять в cpu_t блок кода, соответствующий старту системы, Две цифры в начале имени символической ссылки определяют порядок запуска скриптов в каталоге /etc/rc.d/rcN.d.

Cкрипт запуска должен иметь специальный формат, например такой:

Главное тут в следующем, во первых скрипт должен иметь как минимум 3 возможных ключа запуска, это: start, stop, restart, поскольку именно эти основные команды используются для запуска, останова и перезапуска. Плюс ко всему к этому в самом начале файла пишутся те самые заветные цифры отвечающие за последовательность запуска:

Где 98 это номер в последовательности запуска, а 02 это номер последовательности останова.

То есть, проще говоря, этот скрипт запуститься 98мым в последовательности очередей, а будет остановлен 2рым.

Итак для того чтоб добавить скрипт и добавить его в автозагрузку надо произвести следующую последовательность действий:

1. Создать исполняемый скрипт по шаблону приведёному выше, заменив исполняемый_файл именем файла который надо запустить.

2. Разместить исполняемый скрипт в /etc/rc.d/init

3. Выполнить команду chkconfig --add исполняемый_скрипт

4. Выполнить команду setup или servicevonf (в зависимости от того работаете вы в графическом режиме или консоли) и выбрать службу, которая будет носить имя исполняемый_скрипт.

Выполнение скрипта при включении/отключении сети

Есть директория /etc/network/ с поддиректориями if-down.d, if-pre-up.d, if-post-down.d, if-up.d. Если разместить скрипт в одной из этих поддиректорий, то он будет выполняться соответственно при выключении, перед включением, после выключения или при включении сети.

Другой способ — указать в файле /etc/network/interfaces одну из следующих директив: up, pre-up, post-up, down, pre-down, post-down. Например, строка

после включения сети выполнит скрипт script.sh. Подробнее можно почитать в man interfaces.

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

Читайте также: