我有一个资源非常有限的系统,我有大约900kB的可用内存,需要实现一个从本地文件读取的脚本,获取一个IP地址,然后ping它并寻找响应(检查一下它仍在工作网络上。)
我遇到的问题不在于解析文件或传递参数,而是当我尝试使用命令替换创建变量来ping时,我可以看到设备冻结并返回SIGSEGV错误代码:
addrVar=`cat some_file_with_only_an_ip_address`
这看起来像一个微不足道的任务,文本文件的解析应该是更多的内存和处理器密集,但它工作正常。我无法在任何有相同或类似问题的地方找到任何提示。有谁知道为什么这不起作用,可能还有解决方案?
完整的示例代码是:
#!/bin/sh
sed -nr 's/IPADDR="([^ ]+)"/\1/p' /etc/config/net > tmpVarFile
var1=`cat tmpVarFile` #this fails, but not the above
其中tmpVarFile仅包含ip地址
谢谢!
解决方案
请参阅@ CharlesDuffy的答案。
使这项工作的最佳方法是读入/ etc / config / net文件,该文件的格式类似于一组shell变量(例如。ipaddress="x.x.x.x"
),然后只需使用以下内容:
. /etc/config/net
if ping -c 1 ipaddress;
then
echo "Success"
else
echo "Failure"
fi
希望有所帮助!
答案 0 :(得分:2)
这里有一个简单的解决方法,因为您只需阅读一行:
read -r var1 <tempVarFile
这避免了完全使用任何子进程,大大减少了内存使用(其中大部分将与fork()
关联以启动子shell--在现有平台上进行复制时不会太大 - 在写,但很难说出古老的,微小的嵌入式平台会做什么 - 而fork()
再次运行/bin/cat
。)
或者,如果/etc/config/net
是受信任的,并且保证是有效的shell脚本而没有不必要的副作用:
. /etc/config/net
if ping "$IPADDR"; then
: ...etc...
fi