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

Я хочу выполнить простую команду непосредственно перед выключением компьютера (время не является существенным).

Для запуска я могу использовать /etc/rc.local – есть ли что-то подобное для выключения?

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

  • Что происходит, когда я нажимаю «Завершить работу» из графического интерфейса?
  • Как запустить скрипт перед остановкой, используя заголовки LSB на Raspbian
  • Как сделать остановку обслуживания одновременно?
  • Система не отключается - как диагностировать
  • Выключение или перезагрузка как обычно
  • Отключение, когда оно не используется в течение определенного времени
  • Причины, по которым сервер недостижим, Как расследовать?
  • Umount сетевые диски с системойd перед выключением
  • 3 Solutions collect form web for “Выполнить команду перед выключением”

    Linux Mint основан на Ubuntu, поэтому я считаю, что система уровня запуска, вероятно, такая же. На Ubuntu скрипты для разных уровней выполнения выполняются в соответствии с их присутствием в каталогах /etc/rc[0-6].d . Уровень выполнения 0 соответствует завершению работы и 6 для перезагрузки.

    Обычно сам скрипт хранится в файле /etc/init.d , а затем символические ссылки помещаются в каталоги, соответствующие требуемым уровням выполнения.

    Поэтому в вашем случае напишите свой скрипт, сохраните его в /etc/init.d/ , затем создайте символическую ссылку в каждом из /etc/rc0.d и /etc/rc6.d (если вы хотите, чтобы оба) указывали на ваш скрипт ,

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

    Вам нужно использовать rc.shutdown сценарий выключения для ядра Linux. Цитирование справочной страницы OpenBSD :

    Когда система выключается с помощью команд reboot (8) или halt (8) или когда для этого сигнализируется init (8) или когда выдается запрос на блокировку клавиатуры (если архитектура поддерживает ее), rc ( 8) вызывается с аргументом “ shutdown ''.

    Таким образом, вы просто открываете свой rc.shutdown и добавляете любые команды оболочки, которые вы хотите выполнить.

    ОБНОВЛЕНИЕ: поскольку Linux Mint основан на Ubuntu, у которого есть другая процедура запуска / завершения работы, вот вам соответствующая процедура:

    Напишите сценарий оболочки, который вы хотите выполнить, и скопируйте в соответствующий каталог в /etc/rc*.d/ . * Соответствует уровню выполнения, на котором вы хотите выполнить скрипт.
    Ubuntu следует за нумерацией уровня запуска Debian, поэтому у вас есть уровень запуска 0 для halt и runlevel 6 для перезагрузки.

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


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

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

    Создайте сценарии запуска и завершения работы с первой строкой #!/bin/sh и сделайте их исполняемыми с помощью chmod +x my_new_filename .

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

     vim /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 
    Linux и Unix - лучшая ОС в мире.