CentOS 7の4Gモデムのウォッチドッグタイマー

この記事は、以前のホームルーター/ファイルサーバーのセットアップに関する出版物を補完するものです。 ここでは、4Gモデムがハングしたときにインターネットに自動的に再接続する問題について説明します。 私は独創的なアイデアのふりをするのではなく、読者に決定を伝えたいだけです。





月に1回程度の絶え間ない作業の過程で、USBモデムがハングすることが起こりました。 これにより、不便な点がありました。自宅のコンピューターにリモートでアクセスできず、映画を事前にアップロードできないことです。 リモートでは、この問題は修正できず、モデムの電源リセットのみが役立ちました。 唯一の方法は、特定の時間にインターネット上のサイトの可用性をチェックし、必要に応じてモデムを再起動するスクリプトを書くことでした。



私はインターネット上でいくつかの実装を見つけましたが、それらのどれも通常私のために機能しませんでした。 それで、私は好みと若い女性で私の番犬を書くことに決めました。 このトピックのスクリプトが基礎として採用されました。 資格が許す限り書き直され、外部オプションなどの新機能が追加されました。



CentOS 7にUSB 4Gモデムをインストールして構成します。
まず、不足しているパッケージをダウンロードする必要があります。

yum install usb_modeswitch usb_modeswitch-data
      
      





モデムを接続し、システムでどのように検出されるかを確認します。

 dmesg ip a
      
      





次に、4Gモデムインターフェイスを設定する必要があります。

 vim /etc/sysconfig/network-scripts/ifcfg-wwp6s0u1i1
      
      





 DEVICE="wwp6s0u1i1" NAME="wwp6s0u1i1" TYPE="Ethernet" ONBOOT="yes" BOOTPROTO="dhcp" HWADDR="XX:XX:XX:XX:XX:XX" NM_CONTROLLED="no" DNS1=127.0.0.1 DNS2=127.0.0.1 DNS3=127.0.0.1 NOZEROCONF="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="no" ZONE="external"
      
      





インターフェイスをオンまたはオフにしたときにインターネットを有効または無効にするスクリプトを作成します。

 vim /sbin/ifup-pre-local
      
      





 #!/bin/bash # PREUP="/etc/sysconfig/network-scripts/pre-up-${1:6}" if [ -x $PREUP ]; then exec $PREUP fi
      
      





 vim /sbin/ifdown-pre-local
      
      





 #!/bin/bash # PREDOWN="/etc/sysconfig/network-scripts/pre-down-$1" if [ -x $PREDOWN ]; then exec $PREDOWN fi
      
      





 vim /etc/sysconfig/network-scripts/pre-up-wwp6s0u1i1
      
      





 #!/bin/bash # echo -en 'AT^NDISDUP=1,1,"internet.yota"\r\n' > /dev/ttyUSB0
      
      





 vim /etc/sysconfig/network-scripts/pre-down-wwp6s0u1i1
      
      





 #!/bin/bash # echo -en 'AT^NDISDUP=1,0,"internet.yota"\r\n' > /dev/ttyUSB0
      
      





ここで、ttyUSB0はモデムポートです。



インターフェイスを上げて、接続を確認します。

 ifup wwp6s0u1i1 ip a
      
      







スクリプト自体
 #!/bin/bash export PATH="$PATH:/usr/sbin" SN="$(basename "$0")" function print_help() { printf "\n" printf ": %s options...\n" "$SN" printf ":\n" printf " -s  .\n" printf " -i   .\n" printf " -d     lsusb -t.\n" printf " -n   .\n" printf " -m  ,   lsusb.\n" printf " -h .\n" printf "\n" } #     ,  . if [[ $# = 0 ]]; then print_help && exit 1 fi while getopts ":s:i:d:n:m:h" opt ; do case $opt in s) SITE=$OPTARG; ;; i) IF=$OPTARG; ;; d) DEV=$OPTARG; ;; n) EP=$OPTARG; ;; m) MM=$OPTARG; ;; h) print_help exit 1 ;; *) printf " \n"; printf "    %s -h\n" "$SN"; exit 1 ;; esac done if [[ "$SITE" == "" ]] || [[ "$IF" == "" ]] || [[ "$DEV" == "" ]] || [[ "$EP" == "" ]] || [[ "$MM" == "" ]] ; then printf "\n" printf "     .\n" printf "  : %s -h\n" "$SN" printf "\n" exit 1 fi M="$(lsusb | grep -w "$MM")" #   lsusb if [[ "$M" != "" ]]; then #  ,    if grep -w -q "$IF" /proc/net/dev; then #    printf "\n" printf "  %s   %s\n" "$SITE" "$IF" printf "\n" if [[ "$EP" -ge 6 ]]; then printf "        5\n" exit 1 else printf " ...\n" flag="0" for i in {1..5}; do # 5    timeout -k 2 -s TERM 16 ping -w 14 -s 8 -c 1 -I "$IF" "$SITE" || flag=$((flag+1)) && printf ":%s/5 (:%s)\n" "$i" "$flag" #   -   if (("$flag" >= "$EP")); then break else read -r -t 1 > /dev/null fi done printf " : %s  %s\n" "$flag" "$i" printf "\n" if (("$flag" >= "$EP")); then #    2 M="$(lsusb | grep "$MM")" #     -    printf "  :\n" printf "%s\n" "$M" | cut -c 34- if ! [[ -d /sys/bus/usb/drivers/usb/"$DEV" ]]; then printf "  Bus  Port .\n" exit 1 else ifdown "$IF" #  printf "%s" "$DEV" > "/sys/bus/usb/drivers/usb/unbind" && printf "%s" "$DEV" > "/sys/bus/usb/drivers/usb/bind" #  # read -r -t 1 > /dev/null ifup "$IF" #  fi fi fi else printf "\n" printf " %s  \n" "$IF" printf "\n" exit 1 fi else printf " %s  .\n" "$MM" fi
      
      







スクリプトは、/ usr / local / bin /にあります。

スクリプトを5分ごとに自動的に実行するには、タスクをcronに追加します。

 crontab -e
      
      





 */5 * * * * /usr/local/bin/watchdog -m Huawei -s ya.ru -i wwp6s0u2i1 -n 3 -d 1-1 > /dev/null 2>&1
      
      





これはdmesgの出力であり、スクリプトの実行時にモデムがリセットされたことを示しています。

 [181709.595498] option1 ttyUSB0: GSM modem (1-port) converter now disconnected from ttyUSB0 [181709.595568] option 1-1:1.0: device disconnected [181709.595798] huawei_cdc_ncm 1-1:1.1 wwp6s0u2i1: unregister 'huawei_cdc_ncm' usb-0000:06:00.0-1, Huawei CDC NCM device [181709.615005] option 1-1:1.0: GSM modem (1-port) converter detected [181709.616597] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0 [181709.623449] usb 1-1: MAC-Address: 0c:5b:8f:27:9a:64 [181709.623958] huawei_cdc_ncm 1-1:1.1: cdc-wdm0: USB WDM device [181709.624341] huawei_cdc_ncm 1-1:1.1 wwan0: register 'huawei_cdc_ncm' at usb-0000:06:00.0-1, Huawei CDC NCM device, XX:XX:XX:XX:XX:XX
      
      





スクリプトは理想からはほど遠いことをすぐに言わなければならないので、私は喜んでアドバイスと健全な批判を受け入れます。

また、 @ AlekseyNemiroというニックネームでToster.ruを使用しているユーザーに、スクリプトの最適化の支援に感謝したいと思います。



UPD 01/22/16 PATH変数にパスを追加するコマンドでスクリプトを補足しました。



All Articles