Как запустить интерактивный скрипт перед выключением xserver?

Каждый раз, когда я выключаю или перезагружаю свой ноутбук (Ubuntu 14.04), я хотел бы запустить скрипт, который проверяет, перенес ли я свой самый новый код в мой удаленный репозиторий git. Если я забыл об этом, то открывает терминал, просит пользователя ввести сообщение фиксации и отправляет изменения. У меня уже есть сценарий работает.

Сейчас я ищу способ, чтобы этот скрипт запускался автоматически при выключении или перезагрузке, но до выхода из GUI.

Мой подход до сих пор с System V Init (да, я знаю, что это немного устарело):

Я копирую свой скрипт инициализации с заголовком LSB в /etc/init.d:

sudo cp ~/git_checker /etc/init.d/

, измените разрешения:

sudo chmod a+x /etc/init.d/git_checker

и настройте сценарии выполнения:

sudo update-rc.d /etc/init.d/git_checker defaults

Когда я тестирую этот скрипт с sudo service git_checker start, Я получаю сообщение об ошибке: "Не удалось разобрать аргументы: не удается открыть дисплей:"

Читая об этом, я обнаружил, что сценарии инициализации не должны использоваться для открытия терминалов (например, так:su user -c 'x-terminal-emulator -e /home/user/git_check.sh'), потому что X-сервер не гарантированно будет работать при выполнении сценариев инициализации.

Так что сценарии инициализации кажутся неправильными. Есть ли другой способ? Может быть, с upstart или systemd?

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

1 ответ

Решение

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

#!/bin/bash

main()
{
  dbus-monitor --profile "interface='com.canonical.Unity.Session',type=signal,member=RebootRequested" | \
  while read -r line;
  do
#   echo $line
     grep -q '.*NameAcquired.*' <<< "$line"  && continue  #  Ignore that first line
    if [ -n "$line"  ];then
       interrupt 
    fi
  done
}

interrupt()
{ 
  # The first command will close the shutdown dialog
  qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.CancelAction
  # place call to your script bellow this comment
  zenity --info --text='Remember to push changes to git repo'
  # Uncomment line bellow for shutdown
  # qdbus com.canonical.Unity  /com/canonical/Unity/Session com.canonical.Unity.Session.Shutdown

}

main

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

ПРИМЕЧАНИЕ. Этот сценарий работает только с графическим интерфейсом, поэтому, если пользователь вводит команду sudo shutdown -P now это не сработает. Вам также необходимо следить за shutdown команда через другой скрипт, используя pgrep shutdown или интегрировать другую функцию в скрипт.

Например, в моем сценарии выше, вы хотите добавить эту функцию

manual_shutdown_monitor()
{
  while true 
  do
  if pgrep shutdown > /dev/null
  then
      zenity --info --text="GOT MANUAL"
  fi
  sleep 0.25
  done
}

И затем вызвать эту функцию в main() как это

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