Как запустить простой скрипт Zenity после отключения от WiFi?
Я бегу Kubuntu 12.10 64bit. Я пытаюсь заставить скрипт bash выполняться, когда я отключен от сети. Я создал файл в папке /etc/network/if-down.d/
называется test
который имеет одну строку:
zenity --info --text="network down!"
Я могу выполнить этот скрипт без проблем; типирование /etc/network/if-down.d/test
в мой терминал вызывает всплывающее окно с сообщением "сеть отключена!". Когда я отключаюсь от своей сети Wi-Fi через сетевой менеджер, ничего не происходит. Отключение моего Wi-Fi USB-ключа также не приводит к появлению окна сообщения. Мое единственное предположение, что по какой-либо причине сценарии в /etc/network/if-down.d/
не выполняются. Добавление #!/bin/bash
первая строка тоже не сработала.
РЕДАКТИРОВАТЬ: 2013-01-02
У меня были некоторые проблемы с использованием ответа gertvdijk (старые правки и комментарии перепутаны), которые сейчас разбираются. Бег zenity
с su
а также DISPLAY=:0
решил мою проблему.
3 ответа
Если вы используете Network Manager (в отличие от командной строки /etc/network/interfaces
файл), вместо этого следует использовать диспетчерские сценарии Network Manager.
Просто поместите ваш скрипт в /etc/NetworkManager/dispatcher.d/
каталог, похожий на if-down.d
подход. Написание сценариев с помощью диспетчерских сценариев Network Manager довольно простое, и я предлагаю прочитать этот (базовый) пример, который опубликован в Arch Wiki:
#!/bin/sh
INTERFACE=$1 # The interface which is brought up or down
STATUS=$2 # The new state of the interface
USERNAME=gert # ENTER YOUR USERNAME HERE
case "$STATUS" in
'up') # $INTERFACE is up
# you could do something here...
;;
'down') # $INTERFACE is down
# Check for other active interfaces and only act on all down
if [ ! `nm-tool|grep State|cut -f2 -d' '` = "connected" ]; then
/bin/su -l ${USERNAME} -c 'DISPLAY=:0 /usr/bin/zenity --info --text="all network interfaces down"'
fi
;;
esac
Для действий в конкретной сети, смотрите этот ответ.
И обязательно перезапустите Network Manager, чтобы продолжить работу с этим новым сценарием.
sudo service network-manager restart
Другие ответы великолепны - возможно, даже лучше, чем этот, но, как обычно, есть другой способ сделать это - на этот раз без необходимости использования системных утилит или повышенных разрешений (sudo).
Моя система работает под управлением Kubuntu 12.04, поэтому этот код, вероятно, будет работать в вашей системе. Он также должен работать на GNOME 2.x, за исключением того, что сценарий автозапуска идет в другом месте.
У меня была похожая проблема, когда я хотел знать, когда мой компьютер отключился (потому что мой ноутбук иногда делает это, отключая Wi-Fi сам по себе, и я часто не замечал маленького красного x на панели задач).
Я добавил небольшой (исполняемый) скрипт в каталог ~/.kde/Autostart, который запускает мой основной скрипт при каждом запуске KDE (это позволяет использовать дисплей и клавиатуру):
#!/bin/bash
if [ -x "$HOME/bin/offline_alert" ] ; then
offline_alert &
fi
Основной сценарий offline_alert проверяет, находится ли я в автономном режиме, с помощью ping с несколькими попытками, чтобы избежать ложных срабатываний, а затем генерирует всплывающее окно с использованием yad (то же самое, что zenity, только улучшенный способ!) И воспроизводит звук. В промежутке между тестированием на наличие изменений в онлайн-статусе он спит, поэтому не использует слишком много ресурсов.
Если вы запускаете его вручную из командной строки и т. Д., Он проверяет, работает ли он уже, и дает вам возможность завершить его.
Код, который проверяет автономность, находится в функции "offline", поэтому его можно легко изменить, не затрагивая остальную часть сценария.
Изображения, значки и звук, которые он использует, жестко запрограммированы, поэтому вам придется заменить свои собственные. Я нашел крутой значок автономного Wi-Fi в Интернете.
Он создает файл журнала, который вы можете или не можете хотеть.
Скрипт настроен на использование уведомлений, но код закомментирован, потому что уведомления исчезли слишком быстро и казались скорее неприятностью, чем помощью.
Это просто еще один способ сделать это, и, возможно, кто-то найдет код полезным.
Джо
Я попробовал это (10.04) и у меня та же проблема. Похоже, что скрипт не знает, на каком дисплее показывать диалог.
Попробуйте заменить свою строку на:
DISPLAY=0:0 zenity --info --text="network down!"
(Если у вас есть несколько дисплеев, вам может понадобиться что-то более тонкое.)