Как запустить интерактивный скрипт перед выключением 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 &