私はalwasysの動作特性を持たないUSB GSMモデムを持っています(Huawei E367u-2)時々リセットされ(ログでUSBデバイスの切断/再接続)、それが戻ってきたとき、異なるttyUSB番号があります。起動時に、usb_modswitchが起動されない場合があります。コンピューターはRaspbianを実行しているRaspberry Piです。
これに対する簡単な解決策があります。CRONは毎分次のスクリプトを実行します。
If WVDIAL is not running:
    Run WVDIAL
スクリプトを次のように変更したい:
If /dev/ttyUSB0 is not present:
    If DevicePresent(12d1:1446):
        ResetDevice(12d1:1446)
    ElseIs DevicePresemt(12d1:1506)
        ResetUSB(12d1:1506)
If WVDIAL is not running:
    Run WVDIAL
明らかにこれは疑似コードですが、次の行を一緒に文字列化する必要がありますが、方法がわかりません。
実行されていない場合、これはwvdialをロードします。
#! /bin/sh 
# /etc/init.d/wvdial
### BEGIN INIT INFO
# Provides:          TheInternet
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Simple script to start a program at boot
# Description:       A simple script from www.stuffaboutcode.com which will start / stop a program a boot / shutdown.
### END INIT INFO
# If you want a command to always run, put it here
# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting GPRS Internet"
    # run application you want to start
    /sbin/start-stop-daemon --start --background --quiet --exec /usr/bin/wvdial internet
    ;;
  stop)
    echo "Stopping GPRS Internet"
    # kill application you want to stop
    /sbin/start-stop-daemon --stop --exec /usr/bin/wvdial 
    ;;
  *)
    echo "Usage: /etc/init.d/noip {start|stop}"
    exit 1
    ;;
esac
exit 0
これにより/sys、特定のデバイスへのパスを見つけることができます。
for X in /sys/bus/usb/devices/*; do
    echo "$X"
    cat "$X/idVendor" 2>/dev/null
    cat "$X/idProduct" 2>/dev/null
    echo
done
そして、正しい/ sysパスがわかっている場合は、USBデバイスをリセットします。
echo 0 > /sys/bus/usb/devices/1-1.2.1.1/authorized
echo 1 > /sys/bus/usb/devices/1-1.2.1.1/authorized
したがって、最後の2つのセクションをストリング/dev/ttyUSB0化して、「コマンドを常に実行したい場合は、ここに配置する」セクションの下にあるセクションにテストする必要があります。
アップデート1
usbresetは機能しますが、機能しません。0を1にのみエコーauthroizedすると、デバイスの切断/再接続が正しくシミュレートされます。
これが、デバイスまたはusb_modeswitchを起動するための秘訣です。そのため、私は何とかこれをまとめることができました。
echo "Searching for $1"
devPath=`lsusb | grep $1 | sed -r 's/Bus ([0-9]{3}) Device ([0-9]{3}).*/bus\/usb\/\1\/\2/g;'`
echo "Found $1 @ $devPath"
echo "Searching for sysPath"
for sysPath in /sys/bus/usb/devices/*; do
    echo "$sysPath/uevent"
    devName=`cat "$sysPath/uevent" | grep $devPath`
    #echo devName=$devName
    if [ ! -z $devName ] 
    then
        break
    fi
done
if [ ! -z  $devName ] 
then
    echo "Found $1 @ $sysPath, Resetting"
    echo "echo 0 > $sysPath/authorized"
    echo 0 > $sysPath/authorized
    echo "echo 1 > $sysPath/authorized"
    echo 1 > $sysPath/authorized
else
    echo "Could not find $1"
fi
したがって、私がしなければならないことは、これをinit.dスクリプトに入れることだけだと思います。
if ttyUSB0 not present
    if 12d1:1446 present
        /usr/sbin/resetdevicebyauthorized 12d1:1446
    else if 12d1:1506 present
        /usr/sbin/resetdevicebyauthorized 12d1:1506
    fi
fi
          
usbresetHuaweiモデムで+1に失敗すると、モデムは回復できず、再起動時にフリーズします。私は現在同じ問題を解決しており、まもなく完全に機能する解決策があるかもしれません。