mysqldump 导出命令实例

mysql 以sql文件导出一个表的部分数据的命令

mysql 以sql文件导出一个表的部分数据的命令

mysqldump -t -uuser -ppassword --database dbname --tables tablename --where="true limit 0,500000" > name.sql

参数介绍:

-t 仅导出数据;

-u 数据库登录用户名

-p 数据库登录用户密码

–database 指定数据库

–tables 指定表

–where 添加where条件

最后 > name.sql 表示 将数据导出在名字为 name.sql 的文件中,此处名字也可以是目录

phalcon 访问IndexController 中只能访问indexAction方法,访问不了testAction

phalcon 访问IndexController 中只能访问indexAction方法,访问不了testAction
但是可以访问ArticleController里面的任意方法
看说是Apache 的rewrite问题

但是我的.htaccess文件都是按照文档里面的。

两个.htaccess

第一个

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule  ^$ public/    [L]
<span">RewriteRule  ((?s).*) public/$1 [L] 
</IfModule>

public目录下面的.htaccess中

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] 
</IfModule>

访问路由 localhost/index/test访问不到,但是localhost/index.php?_url=/index/test可以访问得到

解决方法:

直接打印 $_request,发现当路径为 localhost/index/test 的时候,没有_url参数,判断是url重新没成功。将 RewriteCond %{REQUEST_FILENAME} !-f 这行去掉,发现_url 的值是 index.php/test

也就是说apache没有将index/test 看成一个整体,分开请求了,先请求index再请求test,当index不存在时,直接去找index.php,index.html,此时index匹配成功重写取消,而index下的test没有匹配成功,重写后就成了index.php/test了。那么apache为什么不是把index/test看成一个整体,而是分开去处理呢?

怀疑是因为httpd.conf中打开了允许列出目录的功能 mod_autoindex;并设置了Options Indexes允许目录浏览,受目录浏览影响导致重写问题,

取消掉Options 的其他参数,仅保留FollowSymLinks参数,重启apache后,index/test 可以正常访问了

难道真是目录浏览功能的问题?

Options +Indexes +Includes +FollowSymLinks +MultiViews

配置中一共有四个参数,挨个试,最后发现是受MultiViews参数影响。。。但是具体为什么就不清楚了,

ps:出现该问题的工具是wampserver 3.0.6 64bit 版本,32bit版本的没出现该问题,老版的apache也没出过现该问题,猜测可能是apache版本升级进行了什么调整导致的,具体原因再论。

2018-11-28 更新
今天看到一篇文章,标题为: apache的MultiViews的问题

文章来源:https://blog.csdn.net/u014359108/article/details/70859651

该博文介绍了:

MultiViews的作用是当访问到目录中不存在的对象时,
如访问”http://localhost/test/target”,
则apache会寻找该目录下的所有target.*文件.
如果test目录下存在target.jpg文件,
则会把这个文件返回给客户,
而不是返回出错信息.
再分析一下我们现在面对的实例.由于MultiViews的特性,
当访问“http://servername/Index/index”时.
由于根目录下存在index.php文件
所以上面的访问会变成这样:
“http://servername/Index.php/index”

到这里,就清楚为什么httpd.conf中有MultiViews 配置是

Options +FollowSymLinks +MultiViews

phalcon 访问indexController 的方法是就只能访问indexAction()了

mysql解决only_full_group_by

mysql解决only_full_group_by

下载安装的是最新版的mysql5.7.x版本,默认是开启了 only_full_group_by 模式的,但开启这个模式后,原先的 group by 语句就报错,然后又把它移除了。

一旦开启 only_full_group_by ,感觉,group by 将变成和 distinct 一样,只能获取受到其影响的字段信息,无法和其他未受其影响的字段共存,这样,group by 的功能将变得十分狭窄了

only_full_group_by 模式开启比较好。

因为在 mysql 中有一个函数: any_value(field) 允许,非分组字段的出现(和关闭 only_full_group_by 模式有相同效果)。

 

具体出错提示:

[Err] 1055 – Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

1、查看sql_mode

01
select @@global.sql_mode;

查询出来的值为:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

2、去掉ONLY_FULL_GROUP_BY,重新设置值。

01
set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

3、上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据下执行:

1
set
sql_mode
='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

 

解决办法大致有两种:

一:在sql查询语句中不需要group by的字段上使用any_value()函数

这种对于已经开发了不少功能的项目不太合适,毕竟要把原来的sql都给修改一遍

二:修改my.cnf(windows下是my.ini)配置文件,删掉only_full_group_by这一项

若我们项目的mysql安装在ubuntu上面,找到这个文件打开一看,里面并没有sql_mode这一配置项,想删都没得删。

当然,还有别的办法,打开mysql命令行,执行命令

1
select @@sql_mode;

这样就可以查出sql_mode的值,复制这个值,在my.cnf中添加配置项(把查询到的值删掉only_full_group_by这个选项,其他的都复制过去):

1
sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;

如果 [mysqld] 这行被注释掉的话记得要打开注释。然后重重启mysql服务

注:使用命令

1
set sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

这样可以修改一个会话中的配置项,在其他会话中是不生效的。

微信invalid signature处理

微信js_sdk, invalid signature 错误,问题原来出在这里了。。。

微信分享功能,测试没问题,放到线上后一直报错,config:invalid signature,签名校验工具生成的和后台生成的一样,网上说的各种方法都实验了一遍,正式线上环境依然报错。

偶尔灵光一闪,发现了问题所在:

因为先用的测试环境,前端的appid就用的测试号的appid,上传到正式环境后,服务器上正式环境的appid是正式的appid,但是前端的没有改,后端sign生成没问题,拿后端的参数校验也没问题,唯独appid,因为是写死在前端的,没有改,所以到线上后,就报错了。。。。

还是自己不够细心,在此记录下,也希望为能为遇到同样问题的您,提供一个解决问题的线索。。

dede 添加addfields属性后,自定义字段还是出不来

dede 添加addfields属性后,自定义字段还是出不来

如下列内容,写好后,发现自定义的mytitle字段没法显示,

{dede:arclist addfields=’mytitle’ row=’8′ }
[field:mytitle/]<br />
{/dede:arclist}

别人的东西用起来就是麻烦,网上查还查不到详细介绍,

但是通过详细观察发现,arclist 用到 addfields 属性时,都伴有 channelid 属性,难道是缺少了这个属性导致的

{dede:arclist addfields=’mytitle’ row=’8′ channelid=’3′ }
[field:mytitle/]<br />
{/dede:arclist}

加上后,自定义的 mytitle 字段可正常显示了

wordpress更新提示“另一更新正在进行”

在后台准备选择WordPress自动升级的时候看到有”另一更新正在进行”错误提示,无法执行升级到最新版本的问题。通过搜索看到也有网友遇到这个问题,可能是因为上一次升级过程中导致占用库表,然后被锁定的关系无法继续。

第一、出现的错误问题

完整解决升级WordPress程序提示"另一更新正在进行"问题

应该是数据库表中有表被锁定导致无法继续。

第二、解决问题

1、登入数据库客户端,打开wp_options数据表,然后找到core_updater.lock字段。

SELECT * FROM blog_options WHERE option_name LIKE ‘%core_updater.lock%’

 

2、找到这个字段,然后删除。

最后,我们再去执行升级WordPress就没有这个”另一更新正在进行”问题错误提示,问题解决了。

执行 rm -rf /bin 命令后

不小心删除了/bin目录,对于我们这种对系统认识不太高的人来说,的确是受到了灾难性的打击,但是静下心来好好搜索分析,还是能找到解决办法的,跨过了一个坎,就是一次成长,亲们,发现php的强大了吗^_^!

由于服务器被挖矿程序黑了,cpu占到100%,在删除相关问题文件的时候,不小心执行了 rm -rf /bin 命令,然后再删除另一个恶意文件时,发现rm命令不能用了,查询一下,发现ls和vi这些个基本命令全都不可用了,这下发现自己闯大祸了。线上服务器出问题从来没有小问题。

什么都不敢动了,赶紧网上查解决办法,网上大体上是给出了两个方案:一个是去机房使用系统光盘恢复bin目录;一个是从相同系统中拷贝bin目录下的文件到当前目录。简单了解了下,如果删除后取消了远程连接,也没办法再登录了,就只能用第一个方法了。还好,我保留着连接没有断,另外有一个相同系统的正常的服务器的bin目录可供使用,所以决定用第二个方案。

然而,问题又来了,bin被删除后,基本上系统什么命令都没办法执行了,cp,scp等等所有能用的命令都不可用了。。。

正在陷入极度恐慌之时,搜索到一篇文章,给了我一个思路,文章地址:http://www.cnblogs.com/hark0623/p/5886091.html,就是将文件放到web服务器上,然后通过wget将文件拉倒当前服务器来。接下来将被删除bin目录的服务器称为A,同系统正常服务器称为B;

按照这个思路,我将B服务器上的bin目录copy了一份到B服务器的web目录,浏览器测试可以将文件下载下来,接下来考虑怎样在A服务器上获取文件。原本文章里面说的使用wget的功能,经测试发现命令不可用,就是说wget也是在bin目录里的命令。那就再换思路,除了bin目录里的命令,还有哪些是可以远程获取文件内容的。

由于A、B两台服务器用的都是php,我就考虑,能不能用php的函数实现从B服务器上复制文件到A服务器上来的可能性。

php执行脚本的路子已经很熟悉了,但是当前情况是,A服务器上已经没办法进行vi等类似的编辑操作,也没法进行git等版本控制器的操作了,那么php有没有类似的命令行操作呢?然后继续网上搜索信息,发现php是可以直接执行php脚本的,参考文章地址:http://www.linuxdiyf.com/linux/13076.html,文章里提供了一个方法:

/usr/local/php/bin/php -r 'phpinfo();'

经过测试,使用下面的命令:

/usr/local/php/bin/php -r '$content=file_get_contents("http://abc.def.com/testbin/ls");file_put_contents("ls",$content);'

顺利的将B服务器上的文件拷贝到了A服务器上来,测试是否可用

./ls

提示权限不足,跟这篇文章给的结果一样:http://www.cnblogs.com/hark0623/p/5886091.html,采用文章里的方法:perl -e “chmod 0777, ‘mkdir'”,perl命令依然不能用,那就继续php解决:

/usr/local/php/bin/php -r 'chmod("ls",0777);'

再次测试 ./ls 发现可用了,按照这个思路,重点拿到了cp和rz文件,通过cp将rz文件copy到 /bin 目录下,然后将剩下的文件全部通过rz上传到A服务器的/bin目录,chmod修改权限后,基本命令都恢复可用了,远程登录也OK了,至此问题解决

php+jquery玩转json数据

web开发,怎样用json数据才能用的爽?

由于json格式的数据在使用上的优势很明显,现在做项目时大多使用json格式进行数据传输,如果使用 php + jquery + ajax ,那使用json数据让码农怎一个爽字了得。。。

但是需要注意的是,php有个函数是将数据转换成json串,不说你们也知道了,就是json_encode()函数,而用这个函数后直接将数据echo,jquery还是不认数据是json数据的,只认为是普通字符串。这事,处理返回结果就让人不爽,复制下面的代码,放到php里面,返回的数据,js可以直接当对象用了,大功告成。。。

header(“Content-type:text/json”);

header头内容不做多余介绍,只要大家用的爽就行,想了解可以自己学去!!!

北漂多年后,竟然

怎样在平凡的生活中,让自己的钱包得到升华,通过积累,让自己走出贫穷的圈子。。。

QQ图片20170511173644
w君系博主同一年毕业的大学同学,当年毕业后一起北漂找工作,如今算下来在北京已工作多年。两人经理相当,都是在帝都从事为大众所熟知的码农一职,收入也基本持平。由于工作原因,两人虽处同一城市,见面的机会却是不多,也就闲时聊聊QQ,通通电话,打打游戏。

上周末小聚,除了博主和w君外,还有其他一些同学,有朋同城来,自是不亦乐乎,找了个高档点的酒店,大家围坐一桌,开怀畅饮,高谈阔论(互相吹牛呗),酒过三巡,菜过五味,大家聊到了存款的事情。真实不聊不知道,一聊不得了啊,同为北漂一族,大家平时聊天工资孰多孰少心里多少有个底,大抵存款相差不应太多的。几个同学里,只有一个同学因人品好,有好的机遇,在一公司工作,赶巧碰上公司上市,员工分股份。该同学一下满了钱包,当时让大家是各种羡慕嫉妒恨啊。然而当天又出现一惊炸朋友圈的消息。

几个同学连博主在内,剩下同学存款都一般的情况下,w君竟然脱颖而出,钱包明显比大家大了好几个罩杯。于是同学们的荷尔蒙一下就被激发了,每个人的眼睛里都写满了三个字“有内幕”。。。

要说w君博主还是很了解的,平时是比别人省吃俭用,但是再节俭,受工资影响,钱包也不至于那么波涛汹涌。那么一定是有什么好的门路能用来发家致富。都知道码农是可以吃着锅里的,想着碗里的,能够做兼职赚外快的,可是w君闲时也和大家一样,基本属于虚度光阴类型的,要是再做个兼职,那估计就没有睡觉时间了。。。

在大家的一再追问下,w君终于向大家倒出了原委。

w君先是问:“你们知道理财吗?”

众人回:“当然知道”

要说理财,出来工作的人,多少都知道一点,就拿博主来说,知道银行活期利息低,但凡发了工资,钱全都扔到某某宝里了。这就是理财啊!

但是w君告诉我们,理财远没有那么简单

“你们往外借钱吗?”

仅一句话,就搞的大家唉声叹气

“我前年借给一初中同学5000元,到现在要不回来”

“你才5000,我借给我那个大学同学20000,到现在都联系不上了”

“我3年前借给一高中同学3000,每次要他还钱都说过几天,结果就是不换”

“熟人借贷一般都不会给借条的,利息更别说,更甚的,像你们这种,可能连要都要不回来”,w君如是说:“我们毕业后不久,我在网上看了一篇关于理财的文章,里面就说了,借钱是最差劲的理财!所以我从不往外借钱,大家都是北漂辛辛苦苦来挣钱的,真正靠得住的朋友,但凡有双手,肯踏踏实实工作的,基本不会找人借钱的,你想想你们找别人借过钱吗?”

“不借给别人钱,并不能代表你不够朋友,不借钱出去,这些钱用来理财,也能带来一部分收入”w君继续道。

想想也是w君还是很够哥们的,虽然对自己吝啬,但是请客帮忙什么的,还真对得住大家。

“光靠不借钱也不该有这么多收入啊?”有同学发现了问题

“对,下面要说重点了”w说到:“余额宝利息高大家都知道,然而还有比余额报利息还搞的!”

“不会是股票吧?那东西我们也不懂啊”有同学说。

“股票风险太高,大多数人进去都是亏钱的,我不推荐你们玩股票,除非你们都是大款,不在乎赔钱”w君接道。

“那难道是什么现货,黄金,白银?天天接到他们的电话,烦都烦死了,真想来一个骂一个”另一个同学说。

“也不是”w君说。

“你就别卖关子了,赶紧告诉大家你的 super idea”博主在秀自己蹩脚的英语了

“我的理财方法就是……”w君故意拉长了语调说到:“找个靠谱的理财平台去投资,收益完虐某宝!”

“愿闻详情”大家一致说。

w君推了推自己的眼镜说到:“卷钱跑路你们都听说过吧?其实不是所有的金融平台都是为了携款跑路的,有一些金融公司是真正的做理财的,他们的理财一般都高于某宝,最然操作上和知名度上没有某宝好,但是重在收益高啊,只要找到一个好的理财平台,就能拿到高收益。而好的理财,不会跑路,还能保证用户收益才是关键”

“那你用的平台是哪个?”大家都忍不住了,一起问到。

“你们问到点子上了”w君一副你们终于开窍了的样子说:“大的平台有很多,也比较靠谱,但是平台收益率一般跟上线时长呈反比,就目前来说,我推荐你们用《创客金融》这款,他们家不仅有新用户红包,像你们第一次注册就能拿到红包,只要进去进行投资,就能将红包变现,当然推荐这家平台最主要的不只是这家平台收益高,还接入了银行存管系统,简单点说,银行存管就是平台的钱是放在银行里用户自己的账号里的,这从根本上杜绝了平台卷钱跑路的风险,没风险,高收益,如果你们身上有几万块的可流动资金,那就赶紧去投吧!我跟你们说我现在就在《创客金融》投。。。”

大家已经顾不上w君在说什么了,纷纷掏出手机。。。。

创客活动第一次尝试写广告文章,写的不好,还望海涵^_^!
借钱不还的,总是让人气愤,博主也深受其害,与其将钱借出去,不如去买个靠谱的高收益理财产品,有意向投资的,请点下面链接

http://w.t.cn/a

诡异的磁盘空间100%报警分析得出df -h与du -sh的根本性差别

诡异的 df -h 磁盘空间100%报警分析,如果没有大文件,很可能是后台部分程序造成,停掉程序就好了,如果磁盘空间是100%,很多操作会受到影响,包括添加用户,修改用户密码,修改crontab,vi编辑文件等

前言:
早晨磁盘报警刚清空完tomcat和nginx日志,使用的命令是类似echo “” > show_web-error.log或者> show_web-debug.log清空语句,然后rm -rf 掉一些tar.gz包,空出来30G空间。而且也关闭了tomcat的debug信息。刚刚又接到报警,磁盘100%了。怎么回事?

1,进去df -h下,确实100%了,如下所示:
[root@localhost ~]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
113G  113G     0 100% /
/dev/sda1              99M   13M   82M  14% /boot
tmpfs                 8.8G     0  8.8G   0% /dev/shm
确实已经100%了,再去/去检查

2,去/根目录check,du -sh *
[root@localhost ~]# cd /
[root@localhost /]# du -sh *
7.8M bin
6.9M boot
131M data
196K dev
111M etc
178M home
131M lib
23M lib64
119M logs
16K lost+found
8.0K media
0 misc
8.0K mnt
0 net
0 nohup.out
3.8G opt
15M pcre-8.33
2.1M pcre-8.33.zip
du: 无法访问 “proc/11575/task/11575/fd/1565”: 没有那个文件或目录
du: 无法访问 “proc/15403/task/14464/fd/625”: 没有那个文件或目录
0 proc
1.4G product
153M repo
143M root
37M sbin
8.0K selinux
363M soft
8.0K srv
0 sys
20K temp
100K tftpboot
2.1G tmp
8.6G usr
184M var
30M varnish-3.0.3
56M zabbix-2.0.8
[root@localhost /]#
看到,占据的磁盘空间所有的加起来也不到30G,可是df -h下来,确实100%呢?差异在哪里?

3,baidu,google资料,找到 http://www.chinaunix.net/old_jh/6/465673.html 里面有这么2段话:
(1):
When you open a file, you get a pointer.  Subsequent writes to this file
references this file pointer.  The write call does not check to see if the file
is there or not.  It just writes to the specified number of characters starting
at a predetermined location.  Regardless of whether the file exist or not, disk
blocks are used by the write operation.

The df command reports the number of disk blocks used while du goes through the
file structure and and reports the number of blocks used by each directory.  As
far as du is concerned, the file used by the process does not exist, so it does
not report blocks used by this phantom file.  But df keeps track of disk blocks
used, and it reports the blocks used by this phantom file.
以及leolein朋友的回复:
谢谢,就是这个原因。
我因为磁盘快满了就删除了一些过期的文件,可能应用程序还在使用这些文件句柄,所以导致了我说的问题。
我把所有的应用程序都停止后,du和df的结果就大致相同了

(2):
This section gives the technical explanation of why du and df sometimes report
different totals of disk space usage.

When a program that is running in the background writes to a file while the
process is running, the file to which this process is writing is deleted.
Running df and du shows a discrepancy in the amount of disk space usage.  The
df command shows a higher value.

如果文件已经删除了,但是还有残留的进程引用它(具体不知道怎么表达好),则df看到的空间使用量并没有减去那些已经删除的文件。而创建并写入一个文件是,判断空间是否足够是依据df(本人认为),所以df 100%的时候就不能写入文件了。–但是创建文件是可以的,我做过测试。查看这些残留进程(姑且这么称呼,我也不知道那些进程叫什么)的方法是lsof
# lsof /home | grep /home/oracle/osinfo | sort +8 | grep ‘^.*070920.*$’
sadc    17821   root    3w   REG  253,1 326492112 926724 /home/oracle/osinfo/070920sar.data (deleted)
sadc    17861   root    3u   REG  253,1 326492112 926724 /home/oracle/osinfo/070920sar.data (deleted)
sadc    17981   root    3u   REG  253,1 326492112 926724 /home/oracle/osinfo/070920sar.data (deleted)
top     17858   root    1w   REG  253,1 169919916 927111 /home/oracle/osinfo/070920top.data (deleted)
top     17977   root    1w   REG  253,1 169919916 927111 /home/oracle/osinfo/070920top.data (deleted)
注意后面的deleted
然后把这些进程都kill掉就可以释放空间了。

我想起了,我早晨在执行echo “” >shop_web.log类似操作的时候,并没有停止tomcat应用,所以应用是一直往log里面写数据的,那么我>的那一刻,是du -sh *可能看到磁盘空间有了,df -h也可以看到磁盘释放了,但是当tomcat应用继续往shop_web.log里面写日志的时候,加载的还是最初打开的那个执行>shop_web.log之前的占据很大磁盘空间的缓存文件。所以磁盘其实一直没有释放掉,而能坚持一天不报警,是由于我rm了一些tar.gz包所释放的空间。

4,重启tomcat和nginx应用
所以,我应该重启tomcat和nginx,应用不再加载旧的缓存文件,执行重启tomcat命令,由于tomcat应用比较多,所以写了一个脚本来执行
[root@localhost local]# cat /root/start_tomcat_port.sh
#!/bin/bash
PID=`ps -eaf|grep apache-tomcat-6.0.37_$1 |grep -v grep |grep -v start_tomcat_port |awk ‘{print $2}’`
echo $1
echo $PID
kill -9 $PID
rm -rf /var/tomcat/$1.pid
/usr/local/apache-tomcat-6.0.37_$1/bin/startup.sh
[root@localhost local]#
执行重启tomcat:
sh /root/start_tomcat_port.sh 6100;
sh /root/start_tomcat_port.sh 6200;
sh /root/start_tomcat_port.sh 6300;
sh /root/start_tomcat_port.sh 6400;
sh /root/start_tomcat_port.sh 6500;
sh /root/start_tomcat_port.sh 6700;
sh /root/start_tomcat_port.sh 7100;
sh /root/start_tomcat_port.sh 7200;
sh /root/start_tomcat_port.sh 7300;
执行重启nginx:
service nginx restart

5,再去check下磁盘空间
[root@localhost local]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
113G   18G   90G  17% /
/dev/sda1              99M   13M   82M  14% /boot
tmpfs                 8.8G     0  8.8G   0% /dev/shm
[root@localhost local]#

看到df -h命令正常了,已经释放了90G的磁盘空间,现在磁盘使用率才17%,nagios报警解除了。

6,汇总一些原理分析
实现原理:
du -s命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;
df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。
du是用户级程序,不考虑Meta Data(系统为自身分配的一些磁盘块)

ps:应用程序打开的文件句柄没有关闭的话,会造成df命令显示的剩余磁盘空间少。而du则不会。
例子:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc,char **argv)
{
if(open(“tempfile”,O_RDWR) < 0){
fprintf(stderr,”open error”);
exit(-1);
}

if(unlink(“tempfile”) < 0){
fprintf(stderr,”unlink error”);
exit(-1);
}

printf(“file unlinked\n”);
sleep(15);
printf(“done\n”);
exit(0);
}

文章来源:http://blog.csdn.net/mchdba/article/details/38305081