Выполнить скрипт при выходе / перезагрузке / выключении в Ubuntu

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

37
задан 24 July 2013 в 14:17

2 ответа

Выполнить сценарий после выхода из системы:

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

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 работать в нужное время.

Источники:

18
ответ дан 24 July 2013 в 14:17

Как это сделать с помощью systemd

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

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


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

В этом описании предполагается, что вы работаете из своего домашнего каталога, а не / 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 позволит вам сделать более четкие различия:

Этот файл был предложен в ответе Unix & amp; 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
0
ответ дан 24 July 2013 в 14:17

Другие вопросы по тегам:

Похожие вопросы: