zoukankan      html  css  js  c++  java
  • shell重定向调试信息

    shell重定向调试信息

    fulinux

    **************************************************************************************************************************************

    作        者:fulinux

    转载声明:http://blog.csdn.net/fulinus/article/details/29912333

    **************************************************************************************************************************************

    背景:移植wifi时,想实现启动后就能通过wifi上网,主要是通过脚本实现。开机启动时运行/etc/inittab脚本, 再调用/etc/init.d/rcS脚本,rcS脚本会依次运行/etc/init.d/文件夹下以Sxx开头的脚本文件,当中S01_network脚本文件是我们须要用到的。S01_network脚本部分内容例如以下:

    #!/bin/sh
    # FILE:/etc/init.d/S01_network
    。。

    if [ -d /sys/class/net/$DEVICE/ ] ; then /apps/tools/ifup-wlan $i route del default dev eth0 route add default gw 192.168.1.1 fi 。。。


    S01_network脚本会调用/apps/tools/ifup-wlan脚本。

    ifup-wlan脚本部分内容例如以下:

    #!/bin/sh
    # FILE:/usr/sbin/ifup-wlan0
    。。

    。 #Start wpa_supplicant to work now mkdir -p /var/run/wpa_supplicant /apps/tools/wpa_supplicant -B -Dwext -i$DEVICE -c${network_cfg_dir}/wpa_supplicant.conf 。

    能够说上面全部脚本都没有错,由于我直接运行rcS脚本后会正常运行后面的全部脚本,运行后正常连接wifi路由器,例如以下:

    [root@TQ2440 /etc/init.d]#iwconfig wlan0
    wlan0     IEEE 802.11bg  ESSID:"fulinus"  
              Mode:Managed  Frequency:2.437 GHz  Access Point: 94:0C:6D:4F:BD:C8   
              Bit Rate=1 Mb/s   Tx-Power=20 dBm   
              Retry  long limit:7   RTS thr:off   Fragment thr:off
              Encryption key:off
              Power Management:on
              Link Quality=70/70  Signal level=-21 dBm  
              Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
              Tx excessive retries:0  Invalid misc:0   Missed beacon:0

    可是却有一个问题。开机并不能实现wifi上网。启动后我发现根本没有连上wifi路由器。例如以下:

    [root@TQ2440 ~]#iwconfig wlan0
    wlan0     IEEE 802.11bg  ESSID:off/any  
              Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   
              Retry  long limit:7   RTS thr:off   Fragment thr:off
              Encryption key:off
              Power Management:on

    这就非常奇怪了。问题不好找。于是在郭工的意见下我開始通过重定向打印脚本的调试信息。

    第一步。定位S01_network脚本。看看问题是不是在这里,于是我在S01_network脚本開始位置和结束位置增加例如以下设置:

    #!/bin/sh
    。。。
    set -x
    #脚本的主要内容
    set +x

    。。

    而且在rcS文件里增加例如以下红颜色的设置:

    #!/bin/sh
    
    if [ ! -f "/var/log/rcS.log" ]; then
            touch /var/log/rcS.log
    fi
    
    for i in /etc/init.d/S??

    * ; do $i >> /var/log/rcS.log 2>&1 done

    启动后我们在/var/log/rcS.log日志文件里看到例如以下信息:

    [root@TQ2440 /etc/init.d]#cat /var/log/rcS.log 
    + [ ! -f  ]
    + touch /var/log/ifup-wlan.log
    + log=/var/log/ifup-wlan.log
    + [ -z  ]
    + export network_cfg_dir=/etc/network
    + cd /etc/network
    + sed -e /ifcfg-[A-Za-z0-9._-]+$/ { s/^ifcfg-//g;s/[0-9]/ &/}
    + ls ifcfg-wlan0
    + sed s/ //
    + sort -k 1,1 -k 2n
    + interfaces=wlan0
    + ifconfig lo 127.0.0.1
    + [ -z wlan0 ]
    + unset DEVICE TYPE
    + fgrep DEVICE= ifcfg-wlan0
    + eval DEVICE=wlan0
    + DEVICE=wlan0
    + fgrep TYPE= ifcfg-wlan0
    + eval TYPE=WLAN
    + TYPE=WLAN
    + [ -z wlan0 ]
    + egrep -L ^ONBOOT=['"]?[Nn][Oo]['"]?

    ifcfg-wlan0 + [ WLAN = Ethernet ] + [ WLAN = PPP ] + [ WLAN = WLAN ] + [ -d /sys/class/net/wlan0/ ] + /etc/network/ifup-wlan wlan0 + route del default dev eth0 route: SIOCDELRT: No such process + route add default gw 192.168.1.1 + set +x + [ ! -f ] + touch /var/log/ifup-wlan.log + log=/var/log/ifup-wlan.log + [ -z ] + export network_cfg_dir=/etc/network + cd /etc/network + ls ifcfg-wlan0 + sed -e /ifcfg-[A-Za-z0-9._-]+$/ { s/^ifcfg-//g;s/[0-9]/ &/} + sed s/ // + sort -k 1,1 -k 2n + interfaces=wlan0 + ifconfig lo 127.0.0.1 + [ -z wlan0 ] + unset DEVICE TYPE + fgrep DEVICE= ifcfg-wlan0 + eval DEVICE=wlan0 + DEVICE=wlan0 + fgrep TYPE= ifcfg-wlan0 + eval TYPE=WLAN + TYPE=WLAN + [ -z wlan0 ] + egrep -L ^ONBOOT=['"]?[Nn][Oo]['"]?

    ifcfg-wlan0 + [ WLAN = Ethernet ] + [ WLAN = PPP ] + [ WLAN = WLAN ] + [ -d /sys/class/net/wlan0/ ] + /etc/network/ifup-wlan wlan0

    并没有发现什么问题。

    第二步,開始定位ifup-wlan脚本文件是否有问题。并做了相似上面的改动。

    #!/bin/sh
    if [ ! -f "$log" ]; then
            touch  /var/log/ifup-wlan.log
            log=/var/log/ifup-wlan.log
    fi
    。。。
    $network_cfg_dir/ifup-wlan $i >> ${log} 2>&1
    。。。

    启动后查看/var/log/ifup-wlan.log文件,看到如信息:

    [root@TQ2440 /etc/init.d]#cat /var/log/ifup-wlan.log 
    。。。
    + /apps/tools/wpa_supplicant -B -Dwext -iwlan0 -c/etc/network/wpa_supplicant.conf
    /apps/tools/wpa_supplicant: can't load library 'libnl.so.1'
    。。。

    也就是说,在运行wpa_supplicant程序时,没有找到libnl.so.1库文件。问题就出在这里。

    于是,我又在/apps/tools/wpa_supplicant -B -Dwext -iwlan0 -c/etc/network/wpa_supplicant.conf这个命令前增加export发现:

    + export
    export HOME='/'
    export OLDPWD='/etc/network'
    export PATH='/sbin:/usr/sbin:/bin:/usr/bin'
    export PWD='/etc/network'
    export SHELL='/bin/sh'
    export TERM='vt102'
    export USER='root'
    export network_cfg_dir='/etc/network'
    + /apps/tools/wpa_supplicant -B -Dwext -iwlan0 -c/etc/network/wpa_supplicant.conf
    /apps/tools/wpa_supplicant: can't load library 'libnl.so.1'

    这个和我在终端上运行export命令看到的结果不一样:

    [root@TQ2440 ~]#export
    export DMALLOC_OPTIONS='debug=0x34f47d83,inter=100,log=logfile'
    export EDITOR='/bin/vi'
    export HISTFILESIZE='1000'
    export HISTSIZE='1000'
    export HOME='/'
    export HOSTNAME='TQ2440'
    export INPUTRC='/etc/inputrc'
    export LD_LIBRARY_PATH='/apps/tslib/lib:/apps/lib'
    export LOGNAME='root'
    export PAGER='/bin/more '
    export PATH='/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/apps/bin:/apps/tools:/apps/tslib/bin:'
    export PS1='[u@h w]#'
    export PWD='/'
    export QT_QWS_FONTDIR='/apps/lib/fonts'
    export QWS_MOUSE_PROTO='tslib:/dev/event1'
    export SHELL='/bin/sh'
    export TERM='vt100'
    export TSLIB_CALIBFILE='/etc/pointercal'
    export TSLIB_CONFFILE='/apps/tslib/etc/ts.conf'
    export TSLIB_CONSOLEDEVICE='none'
    export TSLIB_PLUGINDIR='/apps/tslib/lib/ts'
    export TSLIB_ROOT='/apps/tslib'
    export TSLIB_TSDEVICE='/dev/event1'
    export USER='root'
    export VAR1=''
    export VAR2=''
    export VAR3=''
    export VAR4=''
    export VAR5=''

    这些环境变量是在profile文件里设置的,原来当登录后。Init进程会分配给你一个shell,这个shell才会读/etc/profile这个脚本作为环境变量。因此没有登录就不会有使能profile文件。

    解决方法:

    在ifup-wlan脚本的这个位置增加红颜色的语句。

       export LD_LIBRARY_PATH=/lib:/usr/lib:$TSLIB_ROOT/lib:/apps/lib
       /apps/tools/wpa_supplicant -B -Dwext -i$DEVICE -c${network_cfg_dir}/wpa_supplicant.conf

    就是将缺少的这个libnl库的路径增加到库路径的环境变量中。

    运行一遍后,wifi就已经连接上了。


  • 相关阅读:
    SmartDb代码修改
    windows下Nginx+RTMP部署
    嵌入式linux下获取flash分区大小
    (转)Qt添加windows开机自启动
    (转)交叉编译lrzsz
    关于海思SDK在Ubuntu下安装错误问题
    电总协议串口调试助手
    使用git将本地仓库上传到远程仓库(转)
    c++中包含string成员的结构体拷贝导致的double free问题
    59. 可变参数
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5054249.html
Copyright © 2011-2022 走看看