Как запустить простой скрипт 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!"

(Если у вас есть несколько дисплеев, вам может понадобиться что-то более тонкое.)

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