Linux下df和du看到的剩余空间不一致处理方式

昨日突然测试用的Linux服务器报存储空间不足,使用 df 查看,磁盘已经使用 100%,使用du 命令查看使用空间最大的目录,结果发现 du 显示的总使用空间才占用总磁盘空间的 70%左右,剩下的 30%空间跑哪去了呢?
找了一下df和du区别的资料,发现他们的工作方式有所区别,所以造成了看到的结果不一致

du的工作原理
du命令会对待统计目录下的文件逐个调用fstat,获取每个文件大小。它的数据获取是基于文件目录中的文件的,可以跨越多个分区操作。如果目录中文件很多,那么du的速度就会很慢.

df的工作原理
df命令使用statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它只能针对整个分区块,运行速度不受文件多少的影响。

du和df不一致的一般原因
常见的df和du不一致情况是文件删除造成的,当一个文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它了。然而如果这个时候还有运行的进程持有这个已被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

一般处理方法
使用lsof命令找到还持有被删除文件句柄的进程,然后关闭进程或者杀掉进程用以释放空间。

lsof | grep deleted

避免这个问题的一般方法
1.可以使用清空文件的方式来代替删除文件,方式是:

echo > myfile

2.对于要经常做删除操作的日志文件,以改名、清空、删除的顺序操作

Popularity: 3% [?]

Random Posts

NDK回调Java类方法碰到的问题解决

以前写的一个Android程序,使用NDK回调Java中的类函数方法,以前在Android 4.x之前的系统上都没有问题,5.x,6.x系统的手机上在回调Java类函数时,出错,报:… invalid object …

搜索Google发现,是由于jni接口触发时,传入的jobject对象使用的是Local reference方式,而自己写的ndk代码是将这个类对象存起来作为全局对象使用了。

http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html

JNI 函数参数中 jobject 或者它的子类,其参数都是 local reference。Local reference 只在这个 JNI函数中有效,JNI函数返回后,引用的对象就被释放,它的生命周期就结束了。若要留着日后使用,则需根据这个 local reference 创建 global reference。Global reference 不会被系统自动释放,它仅当被程序明确调用 DeleteGlobalReference 时才被回收。(JNI多线程机制)
gobj=(*evn)->NewGlobalRef(evn, object);

需要在存起来的地方将这个类对象先NewGlobleRef一下,使其不会由于在退出这个保存对象的jni调用后就因为Local临时对象引用被销毁掉,导致后续的NDK调用访问不到这个临时对象,报错跳出程序。

代码做了这个小修改后,再在NDK代码中调用这个java类的方法,程序没有再报错。

Popularity: 3% [?]

Random Posts

尝试安装使用Checkmarx过程中碰到的问题解决方法记录

最近找到了一份Checkmarx安装包,这是一款比较强大的用于静态分析源代码,找出代码中可能存在的安全漏洞,
对常见的语言都有支持,比如ASP,PHP,Rubby,Python,JavaScript,CSharp,Java等

在尝试安装使用的过程中碰到了如下一些问题:

  1. 使用的SQLServer数据库连接不上
  2. 开始默认安装的系统认证方式连接数据库,结果启动服务时起不来,看日志为数据库连接不上,提示NT Authrity失败,于是尝试使用SQLServer的认证,修改Config目录下的数据库连接配置文件,添加上User Id,Password数据库连接账号,重新启动Checkmarx的服务,发现还是连不上,查看SQL Server的文档,发现Integrated Security要设置为False值,否则还是会忽略数据库的账号密码,使用系统认证连接数据库。再次修改后,重新启动服务,启动成功。

  3. Git版本库连接不上
  4. 添加要扫描的项目代码时,使用Git版本库作为来源,但是总是提示ssh认证不通过,最后发现使用git2.x的客户端不行,网上找了一个git1.9的客户端在Checkmarx的扫描服务器上重新安装,问题解决。

  5. 使用中文界面,部分漏洞的中文说明显示为乱码
  6. 分析显示的文字,感觉是没有正确采用编码显示,感觉像utf-8编码未能正常显示,在数据库服务器上打开CxDB数据库,找到cwe表,看到里面有LanguageId为2052的Description字段中文字有中文,抽样看了一些字段中数据值,部分正常显示中文,部分显示出来为乱码。写了一个小工具,对显示不正常的记录数据读取出啦,转为Utf8编码重新保存到数据库中(一共200多条中文描述记录中有90来条乱码),Web页面上原先显示不正常的中文显示正常。但是生成的中文报告,原先乱码的在报告中还是乱码,应该需要修订另外一个字段中的值。

Popularity: 3% [?]

Random Posts

JIRA和HipChat服务端集成时,提示不能访问HipChat服务器地址问题的解决

HipChat现在可以安装在本地环境,试着装了一个,在网上申请了免费SSL证书设置后,浏览器打开没有提示非安全站点的问题,一切正常。
然后尝试将HipChat和Jira集成,
通过Market市场在Jira上下载安装了HipChat的插件,安装后,在Jira后台管理界面系统那页Email配置项目下面出现了HipChat集成设置菜单项,
输入安装的HipChat服务器地址, https://mychat.mydomain.com, 点击确定,提示不能连接HipChat服务地址,浏览器中打开地址确是正常的。
想不通问题,查看jira的日志文件,发现有日志

javax.net.ssl.SSLHandshakeException: sun.security.validateor.ValidatorException:
  PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
    unable to find valid certification path to requested target

原来是SSL证书问题,因为不是默认可以被java认可的根证书签名,需要导入证书。

keytool -import  -alias mycert -file root.crt -keystore $JAVA_HOME/jre/lib/security/cacerts

输入密码 changeit,导入证书
使用如上命令导入申请的免费SSL证书的crt证书文件后,再次设置HipChat服务器地址,确认,顺利进入集成设置界面。

Popularity: 4% [?]

Random Posts

SOATest浅尝使用脚本设置HTTP请求参数

SOATest是Parasoft公司的一款测试工具,功能强大,可以用于Http接口测试。通常指定好接口地址,设置好输入参数列表后,即可获得接口数据做检查。
碰到一个http请求要做参数签名的情况,请求需要添加两个参数,
_timestamp 请求发生时的Unixtime 时间戳
_sign 对所有参数值排序后连接起来,和一个协商好的 secret 值做md5运算 _sign=md5(secret + 排序后的参数值字符串 + secret)

这两个参数不能在输入时确定,需要在发生请求是动态生成,因此需要写脚本来设置。
翻看了SOAtest的用户手册 和 SOAtest Extensibility API帮助文档,没有找到获取请求参数列表的方法,
经过多番研究尝试,最终搞定,脚本如下

脚本1. 获取时间戳值

from java.util import *
from java.text import *
from java.lang import *

def getTime():
  calendar = Calendar.getInstance()

  date = calendar.getTime()

  ts = date.getTime() / 1000
  return ts

脚本2. 获取参数列表后,对参数列表做签名计算

from com.parasoft.api import *
from webtool.data import *
from java.lang import *
from java.util import HashMap
from java.security import *

#计算参数签名
def getParamsSign(context):
    mc = context.getTool()
    params = mc.getURLParams()
    names = []
    mp = HashMap()
    for p in params:
        name = p.getName()
        if name != "_sign":
            value = p.getValue(context)
            mp.put(name,value)  # 将需要签名的参数放到列表中存起来
            names += [name]
            #Application.showMessage('param ' + name + ' value '+ value)
        else:
            #Application.showMessage('param _sign value ' + p.getActualValue())  #不能调用p.getValue(context), 会触发死循环  

    #拼装要签名的字符串
    names.sort()
    tosign = ''
    for k in names: #mp.keySet():
        tosign += k;
        tosign += mp.get(k)
    secret = context.getEnvironmentVariableValue('client_secret')
    tosign = secret + tosign + secret
    Application.showMessage('tosign:' + tosign)

    #作签名运算
    md5Inst = MessageDigest.getInstance('MD5')
    md5Inst.update(tosign.encode('utf-8'))
    hexDigits = '0123456789abcdef'
    md = md5Inst.digest()
    signed = ''
    for v in md:
        t = v >> 4 & 0x0f
        signed += hexDigits[t]
        t = v & 0x0f
        signed += hexDigits[t]
    Application.showMessage('signed:' + signed)
    #返回签名结果
    return signed

注意要点,在获取参数列表时,用于参数签名的 _sign 字段名要刨除在外,否则获取_sign值时会触发脚本,陷入死循环

Popularity: 3% [?]

Random Posts

MAC系统下JTest死机问题的解决方法

辛苦找到一个Mac版的JTest,安装运行一切正常,高兴中,
打开一个实际的java项目做检查,检查出了代码中得问题,继续高兴中,
然后双击问题转到问题代码行进行编辑,保存,JTest界面上小轮子不停转动,失去反应,悲伤中。

查找原因,发现日志有记录

java.lang.OutOfMemoryError:  PermGen space

google搜索,发现要添加如下两行到Eclipse.app/Contents/MacOS/eclipse.ini 文件中

-XX:PermSize=256M
-XX:MaxPermSize=256M

保存后,运行jtest命令,发现问题依旧,经过多次尝试后,
发现直接双击运行位于parasoft/test目录下的Eclipse,问题消失。
分析直接运行jtest命令失败原因,可能是需要添加如下运行参数运行

jtest -vmargs -Xmx1024m -XX:MaxPermSize=256m

Popularity: 3% [?]

Random Posts

初试Coverity对C++代码的静态检查

之前一直在使用一个版本的goanna做C++静态代码,前两天搞到一套Coverity,尝试安装了一下,发现Coverity检查功能还是挺强大,之前goanna未检查出得一些问题它检查出来了,比如
if ((x & 0×80) == 1)) {
}
这么一个判断代码,之前的goanna就没有报出问题,这个Coverity就报出了一个无效语句的问题,一下子发现等于的判断条件写错了。
Coverity的简单使用流程
第一步, 使用 cov-build 捕获代码Build过程涉及到得文件

./cov-build --dir . make

第二步, 使用 cov-analysis 对捕获的结果做代码分析(分析在cov-build步骤捕获到得相关代码文件)

./cov-analysis --dir .

第三步, 使用 cov-format-errors 输出html格式的分析结果,方便查看出问题得代码位置做代码修订。(这一步也可以使用 cov-commit-defects 提交分析结果到中心服务器,没有安装 platform 没有做效果尝试)

./cov-format-errors --dir . --html-output ./html

打开html目录下的 index.html 即可查看分析结果。

Popularity: 3% [?]

Random Posts

Confluence版本升级要点2

对使用的Confluence升级了一下,发现升级过程中得备份原数据速度较慢,
经过分析,发现Confluence在数据目录下建立了备份目录,升级备份时也会将这个目录下的文件再次备份
登录到管理后台,转到每日备份的设置界面,发现只能修改备份的文件名,备份的目录不能修改,
到atlassian官方网站查看,发现要修改一下数据目录下的confluence.cfg.xml文件,在其中添加一个如下项目

true

保存文件后,重新启动confluence服务,发现每日备份的备份目录可以修改,
修改到其他目录下,保存,以后升级时就不用再担心升级时再次备份这些每日备份的打包文件了。

Popularity: 4% [?]

Random Posts

JIRA升级后碰到授权码为空打不开网页问题的解决方法

闲来手快,从atlassian官网下载了最新版本的Jira将原先安装的老版本升级了一下,然后悲催了,jira只能显示首页,然后一登陆系统就打不开了,看日志总是提示

Caused by: com.atlassian.extras.decoder.api.LicenseDecoderNotFoundException: Could not find any valid decoders in [com.atlassian.extras.decoder.v2.Version2LicenseDecoder@5925307e, com.atlassian.extras.decoder.v1.Version1LicenseDecoder@11ccab9e] for license string <>

看来是是授权码问题,于是找输入授权码的地方,不过还是很悲催,网页打不开没有办法输入授权码信息。
琢磨一阵以后,最后采用如下方法步骤解决:
1. 新建一个空得数据库,然后全新安装一个新版本到这个库上,在这个过程中输入授权码信息,直到正确登陆JIRA后。
2. 将新安装得表结构和老得数据库对比,找到数据库中存放授权码信息的表位置和值
(表propertyentry中有一个如下值

       ID	ENTITY_NAME	ENTITY_ID	PROPERTY_KEY	propertytype
10027	jira.properties	1	License20	6

propertytype值为6的数据记录在propertytext表中,将这个记录值补充到原始库表中,
propertyentry和propertytext两张表都要插入对应的值,启动Jira后发现提示授权不对,
继续找发现还有如下一个记录值要对应修改

ID	ENTITY_NAME	ENTITY_ID	PROPERTY_KEY	propertytype
10013	jira.properties	1	jira.sid.key	5

propertytype值为5的数据值存放在propertystring表中,
两个地方都修改一致后,再次重启jira,正常登陆使用。

Popularity: 4% [?]

Random Posts

在Linux下搜索包含特定字符串的文件列表

之前一直使用

find . |xargs grep “文字”

的方式查找包含文字的文件列表,
但是最近发现一个问题,当要查找的字符串是Unicode编码的时候,这种方式只能查找ansi的字符串,遇到Unicode的字符串查找不到

替换为如下方式查找

find . |xargs strings -e l -f |grep “文字”

找到需要的文件列表,
strings 的-e l 参数表示提取文件中的unicode字符串。 -f 参数表示在字符串前面列出文件名

Popularity: 4% [?]

Random Posts

← Previous PageNext Page →