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路由器,例如以下:

[[email protected] /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路由器。例如以下:

[[email protected] ~]#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日志文件里看到例如以下信息:

[[email protected] /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文件,看到如信息:

[[email protected] /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命令看到的结果不一样:

[[email protected] ~]#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=‘[\[email protected]\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就已经连接上了。

时间: 2025-01-11 05:23:26

shell重定向调试信息的相关文章

shell脚本调试技术_转

转自:http://itlab.idcquan.com/linux/SHELL/727128.html 本文全面系统地介绍了shell脚本调试技术,包括使用echo, tee, trap等命令输出关键信息,跟踪变量的值,在脚本中植入调试钩子,使用"-n"选项进行shell脚本的语法检查, 使用"-x"选项实现shell脚本逐条语句的跟踪,巧妙地利用shell的内置变量增强"-x"选项的输出信息等. 一. 前言 shell编程在unix/linux

Linux Shell 程序调试

Linux Shell 程序调试 Shell程序的调试是通过运行程序时加入相关调试选项或在脚本程序中加入相关语句,让shell程序在执行过程中显示出一些可供参考的"调试信息".当然,用户也可以在shell程序中的适当位置加入一些echo命令用于调试与跟踪.   方法一:在运行脚本程序时加入调试选项: [用法]bash –选项 ./shellScript.sh 几个常用的调试选择项如下:         -e :如果一个命令返回一个非0退出状态值(失败),就退出.         -n 

Shell脚本调试技术

一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟练掌握shell编程也是成为一名优秀的unix/linux开发者和系统管理员的必经之路.脚本调试的主要工作就是发现引发脚本错误的原因以及在脚本源代码中定位发生错误的行,常用的手段包括分析输出的错误信息,通过在脚本中加入调试语句,输出调试信息来辅助诊断错误,利用调试工具等.但与其它高级语言相比,shell解释器缺乏相应的调试机制和调试工具的支持,其输出的错误信息又往往很不明确,初学者在调试脚本时,除了知道用echo语句输出一些

【转】shell脚本调试(bash trap support bashdb )

原文网址:http://zhu8337797.blog.163.com/blog/static/170617549201122512712136/ 命 令 选 项 功 能 bash –x 脚本名 回显 在变量替换之后.执行命令之前,显示脚本的每一行 bash –v 脚本名 详细 在执行之前,按输入的原样打印脚本中各行 bash –n 脚本名 不执行 解释但不执行命令 set –x 打开回显 跟踪脚本的执行 set +x 关闭回显 关闭跟踪功能 --------------------------

linux shell 管道命令(pipe)使用及与shell重定向区别

linux shell 管道命令(pipe)使用及与shell重定向区别 看了前面一节:linux shell数据重定向(输入重定向与输出重定向)详细分析 估计还有一些朋友是头晕晕的,好复杂的重定向了.这次我们看下管道命令了.shell管道,可以说用法就简单多了. 管道命令操作符是:"|",它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard error 信息没有直接处理能力.然后,传递给下一个命令,作为标准的输入 st

利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境

修改XEN的源码实现额外的功能,需要有一个调试环境来得到XEN的调试信息(有关源码编译并安装 XEN 请阅读我以前的博文:在CentOS下源码安装 Xen并搭建Windows虚拟机),这里有一篇很好的搭建方法:Xen Serial Console,可是光阅读它还不够,中间还会遇到许多问题,本博文介绍一下环境搭建的经过,以及遇到的问题的解决办法,希望对大家有用. 得到 XEN 的 Debug String 需要靠串口(Serial Port)来接收并输出,除了使用 RS232 线缆连接两台机器之外

在Linux下调试信息输出自定义颜色字体

Date:2015.5.15  Author:杨正  QQ:1209758756[email protected]   在Linux环境下进行软件开发时,调试是经常做的事情,为了让调试信息更加清晰方便,这里讲解如何输出带有自定义的颜色字体,比如可以自定义输出颜色为红,绿,蓝等,与其他打印信息区分开来. 首先讲解在shell脚本中的应用: 在shell中使用echo命令输出带颜色的文本 名称 echo - 显示一行文本 概要 echo [选项]... [字符串]... 描述 向标准输出输出字符串.

第01课:调试信息与调试原理

Linux下C/C++程序开发,即使使用Makefile.Cmake等编译工具,其最终都是调用GCC这一编译工具组的.这里说的工具组,是因为编译C程序和C++程序使用的编译工具还是有一点差别的,一般编译C程序使用GCC,编译C++程序使用G++.(下文统一使用GCC这一名词代指). 我使用的操作系统是Deepin.如果你机器上没有GCC和GDB,可以安装一下. debian系列的使用  apt-get redhat系列的使用  yum 一般要调试某个程序,为了能清晰地看到调试的每一行代码.调用的

shell重定向介绍及使用

我们在写脚本或用脚本时,往往会发现 > /dev/null 2>&1 这类的命令.之前都是简单的了解一下,并没有深度消化,直到自己写脚本时,不认真写成了2>&1 >/dev/null,导致结果出问题.下面我通过网络给大家介绍一下: shell重定向介绍: 我们平时写的脚本或启动程序,某段代码会处理外部的输入,然后将调用传参指行命令结果输出到屏幕或指定的位置.在交互式的脚本中,输入来自用户的键盘和鼠标,结果输出到用户的屏幕或设备中.而对于某些后台运行的启动脚本或程序,