LINUX.ORG.RU

dhclient не работает при запуске udev'ом

 , ,


0

1

Странные вещи творятся с моим 4G-модемом: почему-то вот этот скрипт

#!/bin/bash
STATUS=0

if [ "$1" = "on" ]; then
    ifconfig beeline up
    sleep 1
    ifconfig eth0 down
    sleep 3
#    for i in $(seq 1 10); do
#       aplay /usr/share/skype/sounds/CallConnecting.wav
        dhclient beeline #&& break
#       sleep 2
#    done
    aplay /usr/share/skype/sounds/CallRingingIn.wav
else
    ifconfig beeline down
    ifconfig eth0 up
fi
не отрабатывается правильно. Т.е. при подключении модема ps показывает, что dhclient запускается, однако, в реальности ничего не происходит. Между тем, если этот скрипт запустить вручную, он отлично сразу отрабатывает.

Вопрос: это как-то лечится?

P.S. система на ноуте: древний арчик (3.9.2-1-ARCH), udev из пакета systemd-196-2, система инициализации — sysvinit.

☆☆☆☆☆

dhclient успевает демонизоваться до того, как его прибьёт udev? Известно, что долгоживущие worker-процессы запрещены.

Попробуй флаг -nw.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

dhclient успевает демонизоваться до того, как его прибьёт udev?

Фиг его знает. Возможно, что не успевает.

Но -nw не помогает. Вот так я видоизменил скрипт:

#!/bin/bash

if [ "$1" = "on" ]; then
    ifconfig beeline up
    sleep 1
    ifconfig eth0 down
    sleep 3
    for i in $(seq 1 10); do
        aplay /usr/share/skype/sounds/CallConnecting.wav
        dhclient -nw beeline
        sleep 4
        ping -W1 -c1 8.8.8.8 && break || killall dhclient
    done
    ping -W1 -c1 8.8.8.8 && aplay /usr/share/skype/sounds/CallRingingIn.wav || aplay /usr/share/skype/sounds/CallFailed.wav
else
    ifconfig beeline down
    ifconfig eth0 up
fi
Делается где-то 4-5 попыток и все — финального звука нет, скрипт тупо убивается.

Вручную запуск dhclient -nw beeline включает сеть за пару секунд.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

ЕМНИП, udev запускает команду не в шелле, а напрямую. Поэтому если указать амперсанд там, он тупо передастся как параметр.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Ага, так и есть.

Я обнаружил проблему: этот скрипт не работает из-за того, что udev запускает в неправильной последовательности (т.е. сначала должно запуститься правило, которое отвечает за именование интерфейса и лишь затем — это правило). Сейчас буду разбираться.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от intelfx

Нет, проблема в том, что у меня сначала правило для подсистемы usb запускается, и лишь потом — для net.

А надо наоборот, т.к. правило net именует интерфейс, а правило usb уже все запускает.

Ну или придумать, как, не зная имени интерфейса, запустить для него dhclient.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от intelfx

Я идиот! Надо всего-то навсего сконфигурировать интерфейс beeline на dhcpd!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от intelfx

Да, я так и сделал. В итоге вот что получилось.

В правиле для "net" добавлена строчка:

SUBSYSTEM=="net", ATTR{address}=="58:2c:80:13:92:63", NAME="beeline",  RUN+="/etc/udev/rules.d/huawei4G on &"
она собственно и запускает сеть.

В правиле для "usb" при подключении просто выставляются права на устройство, а при отключении вырубается dhclient:

SUBSYSTEM=="usb", ACTION=="add", ATTRS{idProduct}=="14db", ATTRS{idVendor}=="12d1", MODE:="0666"
SUBSYSTEM=="usb", ACTION=="remove", ATTRS{idProduct}=="14db", ATTRS{idVendor}=="12d1", RUN+="/etc/udev/rules.d/huawei4G off"

Вот и сам скрипт:

#!/bin/bash

if [ "$1" = "on" ]; then
    ping -W1 -c1 8.8.8.8 && exit # prevent running twice
    ifconfig eth0 down # turn off eth0
    ifconfig beeline up || exit # check connection aviability
    for i in $(seq 1 10); do # now try to run dhclient
	aplay /usr/share/skype/sounds/CallConnecting.wav
	dhclient -nw beeline &
	sleep 4
	ping -W1 -c1 8.8.8.8 && break || dhclient -r beeline
    done
    # check if there's all OK
    ping -W1 -c1 8.8.8.8 && aplay /usr/share/skype/sounds/CallRingingIn.wav || aplay /usr/share/skype/sounds/CallFailed.wav
else
    dhclient -r beeline # why this line don't work?
    killall dhclient # this works fine
    ifconfig beeline down
    ifconfig eth0 up
fi
dhclient -r из скрипта почему-то не убивал клиента dhcpd (хотя вручную все ОК), поэтому пришлось добавить на всякий случай еще и killall.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Амперсанд из запуска удалить

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от intelfx

systemd

Не матерись! Был бы у меня systemd, я бы просто вообще никак не мог даже иксы запустить!

Eddy_Em ☆☆☆☆☆
() автор топика

Специально для Eddy_Em.

На НенужноТВ теперь используют drm и чтобы работало нужен hal или hal-flash и почистить кэш в хомяке от flashplayer (.adobe). Те, кто говорят что ВР либо пользуются старьём, где есть hal, либо поставили hal-flash, либо пользуются оффтопиком, либо идиоты.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.