即使是RAID多张盘组成高可用,但在Linux下显示也是一块,但有时用df -h看不清楚,得用 fdisk -l 查看:
一)Linux下机械磁盘大小查看之fdisk命令使用方法:
[root@xidan-testserver-428 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol03
22G 22G 0 100% /
/dev/mapper/VolGroup00-LogVol00
32G 4.4G 26G 15% /usr
/dev/mapper/VolGroup00-LogVol01
32G 6.3G 24G 21% /var
/dev/mapper/VolGroup00-LogVol04
171G 865M 161G 1% /data
/dev/sda1 244M 20M 212M 9% /boot
tmpfs 4.0G 0 4.0G 0% /dev/shm
查看总大小:fdisk -l,有299.4G,但是实际分成下面两个区后并没有那么大:
[root@xidan-testserver-428 ~]# fdisk -l
Disk /dev/sda: 299.4 GB, 299439751168 bytes
255 heads, 63 sectors/track, 36404 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 32 257008+ 83 Linux
/dev/sda2 33 36404 292158090 8e Linux LVM
合计大小:
[root@xidan-testserver-428 ~]# expr 22 + 32 + 32 + 171 + 4
261
二)背景:vps出现负载高的情况,有一盘是挂载的,不知是不是因代码放上面运行慢引起的,磁盘不行?
阅读全文
一)Linux下机械磁盘大小查看之fdisk命令使用方法:
[root@xidan-testserver-428 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol03
22G 22G 0 100% /
/dev/mapper/VolGroup00-LogVol00
32G 4.4G 26G 15% /usr
/dev/mapper/VolGroup00-LogVol01
32G 6.3G 24G 21% /var
/dev/mapper/VolGroup00-LogVol04
171G 865M 161G 1% /data
/dev/sda1 244M 20M 212M 9% /boot
tmpfs 4.0G 0 4.0G 0% /dev/shm
查看总大小:fdisk -l,有299.4G,但是实际分成下面两个区后并没有那么大:
[root@xidan-testserver-428 ~]# fdisk -l
Disk /dev/sda: 299.4 GB, 299439751168 bytes
255 heads, 63 sectors/track, 36404 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 32 257008+ 83 Linux
/dev/sda2 33 36404 292158090 8e Linux LVM
合计大小:
[root@xidan-testserver-428 ~]# expr 22 + 32 + 32 + 171 + 4
261
二)背景:vps出现负载高的情况,有一盘是挂载的,不知是不是因代码放上面运行慢引起的,磁盘不行?
阅读全文
背景:curl "http://jackxiang.com/post/7634/" curl: (52) Empty reply from server,我估计是Nginx的缓存cgi动态为静态的模块可能出了点问题。
今天调试nginx 模块,使用 curl 发http 请求,结果得到这么个错“Empty reply from server”,死活不得其解。
后来,使用gdb调试另外一个东西,还没到断点处就停了,执行下一步,就挂掉了。这时看curl的返回,正是“Empty reply from server”。
ps 发现原来nginx子进程已经没了,换成了新的(如果有子进程挂掉,nginx会启动一个新的)。
就这两个模块:
http://www.grid.net.ru/nginx/upload.en.html
http://labs.frickle.com/nginx_ngx_cache_purge/
顺带升级了一下nginx为1.7.7好像就有上面这个问题,加一个nginx_upload_module模块(编译不过去,后来去了。),重新编译一次nginx,问题依旧:
最终问题从nginx的error里查到:
2014/11/22 14:38:14 [crit] 8855#0: *260 writev() "/usr/local/nginx/fastcgi_temp/9/08/0000000089" failed (28: No space left on device) while reading upstream, client: 27.150.222.72, server: jackxiang.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "www.jackxiang.com", referrer: "http://www.jackxiang.com/"
是nginx中fastcgi的一个缓存文件,磁盘满了,我靠,查了好一会喔。
___________________________________________________________
Nginx-1.3.X,Nginx-1.4.X安装nginx_upload_module-2.2.0.tar.gz会有点问题,报
/opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c: In function ‘ngx_http_read_upload_client_request_body’: /opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’ 没有名为 ‘to_write’ 的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2687: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_do_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2769: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2785: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2877: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
选择Nginx-1.2.X的就没问题。
来自:http://gcoder.blogbus.com/logs/44505794.html
今天调试nginx 模块,使用 curl 发http 请求,结果得到这么个错“Empty reply from server”,死活不得其解。
后来,使用gdb调试另外一个东西,还没到断点处就停了,执行下一步,就挂掉了。这时看curl的返回,正是“Empty reply from server”。
ps 发现原来nginx子进程已经没了,换成了新的(如果有子进程挂掉,nginx会启动一个新的)。
就这两个模块:
http://www.grid.net.ru/nginx/upload.en.html
http://labs.frickle.com/nginx_ngx_cache_purge/
顺带升级了一下nginx为1.7.7好像就有上面这个问题,加一个nginx_upload_module模块(编译不过去,后来去了。),重新编译一次nginx,问题依旧:
最终问题从nginx的error里查到:
2014/11/22 14:38:14 [crit] 8855#0: *260 writev() "/usr/local/nginx/fastcgi_temp/9/08/0000000089" failed (28: No space left on device) while reading upstream, client: 27.150.222.72, server: jackxiang.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "www.jackxiang.com", referrer: "http://www.jackxiang.com/"
是nginx中fastcgi的一个缓存文件,磁盘满了,我靠,查了好一会喔。
___________________________________________________________
Nginx-1.3.X,Nginx-1.4.X安装nginx_upload_module-2.2.0.tar.gz会有点问题,报
/opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c: In function ‘ngx_http_read_upload_client_request_body’: /opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’ 没有名为 ‘to_write’ 的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2687: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_do_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2769: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2785: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2877: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
选择Nginx-1.2.X的就没问题。
来自:http://gcoder.blogbus.com/logs/44505794.html
背景:今天访问自己博客时偶尔出现如下mysql问题:
Bo-Blog Database System Tips: Can not connect to MySQL server
Time: 2014-11-22 4:56am
Script:
Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
Errno.: 2002
找了一下有一位兄弟是这么说的:
刚刚装好的环境,经常会出现Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ 的问题。其实解决这个问题一般有两种解决方法的思路:
其一,就是mysql启动的时候生成的这个mysql.sock文件,而却所在的文件夹的写入权限,所以给这个文件夹足够的权限就好了,至于这个文件夹在哪儿,可以查看/etc/my.cnf就能看到。
vi /etc/my.cnf
其二,就是php没有加载上这个文件。具体做法就是查看php.ini,里面相关联的mysql.sock文件所在的地址是否跟/etc/my.cnf生成的一致。php.ini中:
?
mysql.default_socket=/tmp/mysql.sock
vi php.ini
璞玉的修改成这个了。
如果修改了php.ini,如果是centos,请重启php-fpm,然后重启nginx或者apache即可。
/TMP/MYSQL.SOCK
摘自:http://www.pooy.net/original-solve-the-problem-cant-connect-to-local-mysql-server-through-sockettmpmysql-sock.html
更多:http://www.linuxdiyf.com/bbs/thread-75335-1-1.html
Bo-Blog Database System Tips: Can not connect to MySQL server
Time: 2014-11-22 4:56am
Script:
Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
Errno.: 2002
找了一下有一位兄弟是这么说的:
刚刚装好的环境,经常会出现Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ 的问题。其实解决这个问题一般有两种解决方法的思路:
其一,就是mysql启动的时候生成的这个mysql.sock文件,而却所在的文件夹的写入权限,所以给这个文件夹足够的权限就好了,至于这个文件夹在哪儿,可以查看/etc/my.cnf就能看到。
vi /etc/my.cnf
其二,就是php没有加载上这个文件。具体做法就是查看php.ini,里面相关联的mysql.sock文件所在的地址是否跟/etc/my.cnf生成的一致。php.ini中:
?
mysql.default_socket=/tmp/mysql.sock
vi php.ini
璞玉的修改成这个了。
如果修改了php.ini,如果是centos,请重启php-fpm,然后重启nginx或者apache即可。
/TMP/MYSQL.SOCK
摘自:http://www.pooy.net/original-solve-the-problem-cant-connect-to-local-mysql-server-through-sockettmpmysql-sock.html
更多:http://www.linuxdiyf.com/bbs/thread-75335-1-1.html
背景:在xp下用IE下载了一个firefox的网络安装程序,下载安装后发现是英文。
好像是更新了一下系统,重启后运行火狐变成了英文,怎么调成中文
1.打开Firefox浏览器,在地址栏输入“about:config”打开
2.点击底部的确认按钮进入
3.在左边第一列找到“general.useragent.locale”这一项,然后双击,把框内内容改为“zh-CN”4.关闭浏览器再打开即可
后来,发现本来就是英文版,设置了没用。还是下载时直接下一个中文的全安装包得了。
好像是更新了一下系统,重启后运行火狐变成了英文,怎么调成中文
1.打开Firefox浏览器,在地址栏输入“about:config”打开
2.点击底部的确认按钮进入
3.在左边第一列找到“general.useragent.locale”这一项,然后双击,把框内内容改为“zh-CN”4.关闭浏览器再打开即可
后来,发现本来就是英文版,设置了没用。还是下载时直接下一个中文的全安装包得了。
这个问题困扰了好久,昨天到网上查了很多资料,介绍了两种办法
1:设置input的height和line-height,line-height比height稍小一些,但这种方式只在IE中生效,FireFox中文字仍然是
顶部显示的
2:设置input的padding-top,padding-top=(height-line-height)/2,这种方法勉强可以是的文字想居中 位置靠近,但padding-top的值的慢慢的调节,调节了很久发现文字终于居中了,结果文本框的高度也变大了,一个很大的文本框看其来总有点不协调,请问大家是怎么调节<input type="text">使得文字居中的( vertical-align:middle 也试过,但是没有效果)
3:请问Dreamweaver中有没有专门用于显示文字的标签呢,就像asp.net中的label一样的,在表单中经常会看到 “用户名:”+文本框 ,怎么让“用户名:”和后面的文本框垂直居中呢
欢迎各位高手指导,最好能亲手调试过在回答,能答多少就答多少,言之有理即可得分
阅读全文
1:设置input的height和line-height,line-height比height稍小一些,但这种方式只在IE中生效,FireFox中文字仍然是
顶部显示的
2:设置input的padding-top,padding-top=(height-line-height)/2,这种方法勉强可以是的文字想居中 位置靠近,但padding-top的值的慢慢的调节,调节了很久发现文字终于居中了,结果文本框的高度也变大了,一个很大的文本框看其来总有点不协调,请问大家是怎么调节<input type="text">使得文字居中的( vertical-align:middle 也试过,但是没有效果)
3:请问Dreamweaver中有没有专门用于显示文字的标签呢,就像asp.net中的label一样的,在表单中经常会看到 “用户名:”+文本框 ,怎么让“用户名:”和后面的文本框垂直居中呢
欢迎各位高手指导,最好能亲手调试过在回答,能答多少就答多少,言之有理即可得分
阅读全文
Linux服务器查看占用IO较高的程序
Unix/LinuxC技术 jackxiang 2014-11-22 12:01
开启IO监控:
sysctl vm.block_dump=1
#或
echo 1 >/proc/sys/vm/block_dump
开启后内核会将IO读写dump到日记,用dmesg查看:
dmesg
进程读写block到磁盘dm-0:
mysqld(7822): READ block 78196624 on dm-0
kjournald(529): WRITE block 211136 on dm-0
bash(8336): dirtied inode 7391146 (dmesg) on dm-0
统计当前占用IO最高的10个进程:
dmesg |awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -n 10
摘处:http://www.haiyun.me/archives/linux-dmesg-io-dump.html
sysctl vm.block_dump=1
#或
echo 1 >/proc/sys/vm/block_dump
开启后内核会将IO读写dump到日记,用dmesg查看:
dmesg
进程读写block到磁盘dm-0:
mysqld(7822): READ block 78196624 on dm-0
kjournald(529): WRITE block 211136 on dm-0
bash(8336): dirtied inode 7391146 (dmesg) on dm-0
统计当前占用IO最高的10个进程:
dmesg |awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -n 10
摘处:http://www.haiyun.me/archives/linux-dmesg-io-dump.html
转贴,Android手机一键Root原理分析,如何获取到root的原理分析。
Unix/LinuxC技术 jackxiang 2014-11-21 17:50
背景:android手机是linux内核的手机,当然linus自己可能发现漏洞,但同时其linux是开源的,代码是公开的,只要能读取其root的一个su的机制,及内核相关权限代码,可能发现各种漏洞,有些漏洞是内核自己的,比如linus作为linux之父亲,自己都提交一个,有些呢是程序调用时需要用root去获取如某些设备权限等,此时会编译原理的大牛就可以在此处作文章了,经过努力是可以实现提权的,再就是利用如linux下多进程的原理:如linux内核会对孤儿进程会用1号进程去收养,恶意创建N多进程后,其adb崩溃重启瞬间没法让1号进程去执行降权,此时adb就是root,这是一个内核和应用程序相结合的提权,总之,提权这种事情都对linux的内核较熟悉,对多进程啊,对哪些地方需要root的代码有研究,也就是黑发生在内部,提权拿钱这种事情,不光linux系统,人类这个大的系统也有类似的情形,叫专政策漏洞,在法律灰色地带干赚钱,法律这套体系已经被他摸透了,已经被root了,法律不健全,或故意不打补丁引起的,所以需要开源、开放、透明,一块打补丁,所谓政策开放、透明、在法制下阳光运行就是这个理儿。
阅读全文
阅读全文
背景:在21ic上看一篇文章说向51单片机say bye bye,有点意思,但是就目前来说新的低成本方案成本低于51的涌现,再就是调试后到硬件的结合程度,再就是对寄存器的操作等都存在问题,于是说bye了,不过目前有新的avr平台如Arduino的出现,不亚于arm下的raspberryPi。也就是说这块来讲人人都能学点皮毛就能开发出一个小硬件功能,但就我的个人感觉呢,这块硬件还是像老中医一样,需要有多年的功力的,不全是像这文章所述一样,精华呢,就像那个周星驰的西游降魔篇中的孙悟空一样,小且有力,有穿透力的,成魔也好成佛也好都得小得有压强,是一个同意的整体,51是你练手摔打的一座小山,come on,呵呵。
阅读全文
阅读全文
背景:想做智能硬件,语音识别成文字,再解析做相关操作是一个重要的点功能,国内就没有一个厂商像google一样提供一个web的协议进行翻译么?能不能更开放点,把这点能力给开放出来,毕竟如果哪家小公司去做这一块成本相当的高,有讯飞一家,还有没有更勇于开放的呢?呵呵,;webchat,只能在微信里用。
阅读全文
阅读全文
Linux操作系统下生成一个指定大小的文件
Unix/LinuxC技术 jackxiang 2014-11-19 17:56
磁盘预留空间的实验:
1、首先在要预留空间的分区上使用dd命令生成一个指定大小的文件:
创建一个10M的文件,名字是foobar:
# dd if=/dev/zero of=/home/foobar bs=1K count=10000
In Unix-like operating systems, /dev/zero is a special file that provides as many null characters (ASCII NULL, 0x00; not ASCII character "digit zero", "0", 0x30) as are read from it. One of the typical uses is to provide a character stream for overwriting information. Another might be to generate a clean file of a certain size. Using mmap to map /dev/zero to RAM is the BSD way of implementing shared memory.
2、将这个文件格式化:
# mke2fs -vFm0 /home/foobar 100000000 //(1K * 10000)
3、将这个文件mount,之后就可以向这个文件中写内容了,就好比向一个目录中写内容一样:
# mount -o loop home/foobar /mnt/mountpoint
摘自:http://blog.csdn.net/penn902/article/details/5746606
更多:http://blog.chinaunix.net/uid-8504518-id-2030389.html
1、首先在要预留空间的分区上使用dd命令生成一个指定大小的文件:
创建一个10M的文件,名字是foobar:
# dd if=/dev/zero of=/home/foobar bs=1K count=10000
In Unix-like operating systems, /dev/zero is a special file that provides as many null characters (ASCII NULL, 0x00; not ASCII character "digit zero", "0", 0x30) as are read from it. One of the typical uses is to provide a character stream for overwriting information. Another might be to generate a clean file of a certain size. Using mmap to map /dev/zero to RAM is the BSD way of implementing shared memory.
2、将这个文件格式化:
# mke2fs -vFm0 /home/foobar 100000000 //(1K * 10000)
3、将这个文件mount,之后就可以向这个文件中写内容了,就好比向一个目录中写内容一样:
# mount -o loop home/foobar /mnt/mountpoint
摘自:http://blog.csdn.net/penn902/article/details/5746606
更多:http://blog.chinaunix.net/uid-8504518-id-2030389.html
[实践OK]Web服务器(如Apache、Nginx)会默认开启对断点续传的支持,php支持断点续传的文件下载类,PHP上传实现断点续传文件的方法。
Php/Js/Shell/Go jackxiang 2014-11-19 17:05
背景:大文件的断点续传,有时网络波动啥的,需要断点从已经下载位置续传下载文件,对于没有传过的文件再次从开始下载就麻烦了,这块http协议支持的,Apache和Nginx都支持这样的方法实现了从某个部分进行断点下载。
服务器是否支持断点续传的判断:
更多 0
断点续传 linux wget 服务器 curl
通常情况下,Web服务器(如Apache)会默认开启对断点续传的支持。因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可享受到断点续传的好处。断点续传是在发起HTTP请求的时候加入RANGE头来告诉服务器客户端已经下载了多少字节。等所有这些请求都返回之后,再把得到的内容一块一块的拼接起来得到完整的资源。
Resumable download file Web服务器(如Apache)默认开启断点续传
你可以通过以下的命令来测试一下。
Linux 测试服务器是否支持断点续传
localhost [~]# wget -S http://httpd.apache.org/images/httpd_logo_wide_new.png 2>&1 | grep ‘Accept-Ranges’
Accept-Ranges: bytes
输出结果 Accept-Ranges: bytes ,说明服务器支持按字节下载。
curl 命令发送字节范围下载
curl –range 0-99 http://images.apple.com/home/images/billboard_iphone_hero.jpg
这样可以到最开始99字节,结果如下图:
curl range bytes request curl 命令发送字节范围请求
说明从服务器端按字节范围下载是完全没有问题的。
现在我们尝试以下方式:
1、一次性下载整个图片。
localhost [~]# curl –range 0-98315 http://images.apple.com/home/images/billboard_iphone_hero.jpg > test.jpg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 98316 100 98316 0 0 524k 0 –:–:– –:–:– –:—:— 527k
完成后,test.jpg完全等于billboard_iphone_hero.jpg,文件大小为98,316 字节。
实践如下:我的Nginx服务器,请求下看是否支持,如下:
1)实践下下载这块的header返回头有Accept-Ranges: bytes证明Nginx也是支持断点续传下载的:
(1)Curl包含range的请求头是这样的:
(2)其抓包Nginx的返回头是这样:
HTTP/1.1 206 Partial Content
Server: nginx
Date: Wed, 19 Nov 2014 14:45:07 GMT
Content-Type: image/jpeg
Content-Length: 109
Last-Modified: Fri, 07 Nov 2014 05:06:12 GMT
Connection: keep-alive
ETag: "545c5344-1b8c"
Expires: Fri, 19 Dec 2014 14:45:07 GMT
Cache-Control: max-age=2592000
Content-Range: bytes 0-108/7052
4)通过前面的curl及wget联合起来,先后组合起来实现一个断点下载整个图片,并看其服务器返回头(curl已经下了前面的108,后从109开始wget:
(1)先保存一部分到108:
(2)再通过wget的断点续传下载命令-c,请求剩下的部分(Content-Range: bytes 109-7051/7052):
A)加上-S看返回头, -S, --server-response 打印服务器响应。:
B)发起头如下,也就是说经curl保存一部分后,wget通过-c参数时,后面它会去读取目前文件大小,后写在http头里去找服务端要,请求头如下:
注意:字节是从0开始,结束字节为总字节长度 减 1。
来自:http://ju.outofmemory.cn/entry/23646
Nginx:http://chenzhenianqing.cn/articles/926.html
阅读全文
服务器是否支持断点续传的判断:
更多 0
断点续传 linux wget 服务器 curl
通常情况下,Web服务器(如Apache)会默认开启对断点续传的支持。因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可享受到断点续传的好处。断点续传是在发起HTTP请求的时候加入RANGE头来告诉服务器客户端已经下载了多少字节。等所有这些请求都返回之后,再把得到的内容一块一块的拼接起来得到完整的资源。
Resumable download file Web服务器(如Apache)默认开启断点续传
你可以通过以下的命令来测试一下。
Linux 测试服务器是否支持断点续传
localhost [~]# wget -S http://httpd.apache.org/images/httpd_logo_wide_new.png 2>&1 | grep ‘Accept-Ranges’
Accept-Ranges: bytes
输出结果 Accept-Ranges: bytes ,说明服务器支持按字节下载。
curl 命令发送字节范围下载
curl –range 0-99 http://images.apple.com/home/images/billboard_iphone_hero.jpg
这样可以到最开始99字节,结果如下图:
curl range bytes request curl 命令发送字节范围请求
说明从服务器端按字节范围下载是完全没有问题的。
现在我们尝试以下方式:
1、一次性下载整个图片。
localhost [~]# curl –range 0-98315 http://images.apple.com/home/images/billboard_iphone_hero.jpg > test.jpg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 98316 100 98316 0 0 524k 0 –:–:– –:–:– –:—:— 527k
完成后,test.jpg完全等于billboard_iphone_hero.jpg,文件大小为98,316 字节。
实践如下:我的Nginx服务器,请求下看是否支持,如下:
1)实践下下载这块的header返回头有Accept-Ranges: bytes证明Nginx也是支持断点续传下载的:
(1)Curl包含range的请求头是这样的:
(2)其抓包Nginx的返回头是这样:
HTTP/1.1 206 Partial Content
Server: nginx
Date: Wed, 19 Nov 2014 14:45:07 GMT
Content-Type: image/jpeg
Content-Length: 109
Last-Modified: Fri, 07 Nov 2014 05:06:12 GMT
Connection: keep-alive
ETag: "545c5344-1b8c"
Expires: Fri, 19 Dec 2014 14:45:07 GMT
Cache-Control: max-age=2592000
Content-Range: bytes 0-108/7052
4)通过前面的curl及wget联合起来,先后组合起来实现一个断点下载整个图片,并看其服务器返回头(curl已经下了前面的108,后从109开始wget:
(1)先保存一部分到108:
(2)再通过wget的断点续传下载命令-c,请求剩下的部分(Content-Range: bytes 109-7051/7052):
A)加上-S看返回头, -S, --server-response 打印服务器响应。:
B)发起头如下,也就是说经curl保存一部分后,wget通过-c参数时,后面它会去读取目前文件大小,后写在http头里去找服务端要,请求头如下:
注意:字节是从0开始,结束字节为总字节长度 减 1。
来自:http://ju.outofmemory.cn/entry/23646
Nginx:http://chenzhenianqing.cn/articles/926.html
阅读全文
Linux双网卡配置两个网关导致网络无法使用
Unix/LinuxC技术 jackxiang 2014-11-17 23:32
Linux服务器有两个网卡,配置eth0为公网使用,eth1为内网使用。
分别为两个网卡配置IP地址,DNS,网关等。重启生效后,发现无法访问公网,ping网关也能ping通,ping同一个网关下的其他公网地址也能ping通。
1> 刚开始ping的时使用域名,怀疑是DNS无法解析,遂直接ping IP地址,同样无法ping,排除与DNS的关系。
2> 由于能够ping同一个网关下的IP地址,所以服务器网卡等肯定没有问题。应该还是网卡配置导致。
3> 后来仔细检查eth0和eth1的配置,发现配置了两个网关。其中eth1配置了内网的网关,修改eht1的网关与eth0一致后,问题解决。
上述问题还是比较容易犯,配置网卡的时候通常都是和别的环境对照着配,稍不注意,就会配置多个网关。
来自:http://www.linuxidc.com/Linux/2011-03/32955.htm
分别为两个网卡配置IP地址,DNS,网关等。重启生效后,发现无法访问公网,ping网关也能ping通,ping同一个网关下的其他公网地址也能ping通。
1> 刚开始ping的时使用域名,怀疑是DNS无法解析,遂直接ping IP地址,同样无法ping,排除与DNS的关系。
2> 由于能够ping同一个网关下的IP地址,所以服务器网卡等肯定没有问题。应该还是网卡配置导致。
3> 后来仔细检查eth0和eth1的配置,发现配置了两个网关。其中eth1配置了内网的网关,修改eht1的网关与eth0一致后,问题解决。
上述问题还是比较容易犯,配置网卡的时候通常都是和别的环境对照着配,稍不注意,就会配置多个网关。
来自:http://www.linuxidc.com/Linux/2011-03/32955.htm
规划产品于做项目:
有产品规划意识也不一定就能做出产品,特别是当我们试图从项目来驱动和衍生产品的时候,我们把项目个性化的内容误认为是产品通用化的内容,由于项目本身的短平快本身就无法形成一个通用化的产品底层模型,同时项目研发和产品研发本身又不分家,最后发现还是在做项目。
很多时候我们根本不会考虑产品规划的事情,因为我们是在做项目,客户项目化定制理所当然,那如果抱着这种思想项目始终无法转会为产品,没有产品自然无法产生应该有的产品化后的规模效应。项目型IT企业最后完全演变为IT外包企业,更谈不上企业的核心竞争力。
有产品规划意识也不一定就能做出产品,特别是当我们试图从项目来驱动和衍生产品的时候,我们把项目个性化的内容误认为是产品通用化的内容,由于项目本身的短平快本身就无法形成一个通用化的产品底层模型,同时项目研发和产品研发本身又不分家,最后发现还是在做项目。
产品规划真正要做的就是产品和项目本身的分离,产品变化为一个平台,项目变化为产品基础上的配置和实施。实施本身存在差异,但是产品平台本身可以产生强大的规模效应和底层支撑。IT企业核心竞争力最终还是体现在产品上,产品是企业核心研发能力和价值的重要体现。对于如何进行产品规划,针对IT企业而言从如下几个方面来进行说明。
背景分析和现状调研
市场驱动研发,当你无法像苹果一样引领市场的还是很,那就更好的去满足市场的需求。既然是规划,那么很多时候考虑的则是不是满足现有需求,而是要去挖掘潜在的市场需求。
背景分析重点是你规划的产品方向相关的业界标准,市场发展趋势,产品所涉及到的新技术的发展趋势等。而现状调研则是当前市场现状,现状分析越清楚越容易后续的定位和差异化。同时现状分析还不包括了我们自身的现状,包括已有的研发产品,已经涉及到的相关项目,团队人员情况等。任何规划要能落地就一定不能脱离实际。
理解市场很困难,因为市场无时无刻不在变化,很多时候需要的是要在合适的时候推出合适的产品。产品本身依托太多的外在环境,IT基础设施的发展等,太超前了是死,完全跟随也没有出路。则是必须面对的一个问题,也是产品规划不可避免的风险。但是你不能回避,没有理解清楚市场,就谈不上细分市场,产品定位和差异化等。正如我们自己,没有清楚的认识自己,就谈不上定位自己和规划自己。
产品定位分析
产品规划的核心在市场营销方法论,而市场营销核心本身又在STP(细分,目标和定位),简单来说核心在于差异化。通过差异化充分的扬长避短,发挥自己的优势。
当我们谈产品的定位的时候,又必须进一步的细化客户的需求,从客户来说我们有哪些客户和客户群,他们是如何划分的?从需求来说有哪些需求和功能要求,其各自的优先级又是如何的。市场驱动研发,从4P到4C,进一步的体现产品最大的成功就是市场销售量,要达到该目标那产品必须实现客户价值,客户价值即时产品价值。
市场和客户想清楚了,那接下来就是匹配的事情,我们的能力必须要匹配需求和能够实现需求,必须要清楚的认识到我们已有的优势和劣势,我们面对哪些竞争。SWOT看着很简单,但是真正分析到位确很困难的,因为很多时候很多是主观分析,很难有完整的数据来做支撑。蓝海里面讲价值创新,那前提是首先通过SWOT分析明确自身的差异化核心价值体现在哪里?这样才能剔除传统和不增值内容,加入新技术和创新点。
产品定位输出包括两个重要方面,一个是做什么产品,或者说做该产品的里面的那一个更加具体的类型,该产品的核心功能必须有哪些?另外一个即是产品的目标市场或客户是谁,目标客户是否足够细分? 很多时候我们老想做一款通吃的产品,到后面导致产品大量的定制和膨胀,最终产品又变成了定制项目。
产品总体规划
切合前面的市场分析和产品定位,那么我们产品规划目标和产品发展愿景是什么?产品愿景将进一步回答产品的核心价值所在。产品愿景是我们期望产品是什么样子,遵循一个什么样的发展路线,解决哪些客户的核心问题以体现核心价值。产品愿景可以看得更加长远点,超过3年或者更长时间,虽然存在太多的不确定性,但是我们仍然要有一个清晰的愿景。正如你想把你的孩子培养成什么样一个人一样,必须有一个大方向和愿景。
产品愿景和大方向清楚了,接下来才是分阶段的规划,或者叫路标规划,路标规划让我们对一个长时间周期的规划有了一个更加清楚的里程碑,这是产品规划内容最粗粒度的一个落地考虑。有了路标,我们的航线更加清晰,要达到最终的大目标我们就必须一个个小路标一步步的走过来。
路标规划是一个长时间周期规划,3-5年甚至更长时间,那这个想清楚了接下来就要考虑最近1-2年如何做?最近3-6个月如何做?这一步需要更加详细的规划,以方便实施和落地。在现在互联网时代,产品研发也必须敏捷,短周期迭代,以应对变化和进行调整。
一个是如何做和做哪些?那么另外一个重要的就是如何推和如何实施?我们在做之前相关的市场规划策划,产品方案等工作就必须开始和并行。产品研发和市场工作并行,而不是等产品真正出来了才考虑如何推广。
产品研发规划
研发规划离我们就很近了,首先研发规划的输入应该是产品规划或产品年度规划,产品年度规划的内容需要通过产品研发规划落地。研发规划可以理解成大的项目计划,那自然应该包括项目范围和需求收集,需求分析和优先级的评估,研发资源的投入和成本,研发功能点,研发进度计划。如果存在多个子产品,还必须考虑研发产品组合规划,然后才是子产品的研发计划。
研发计划需要进一步细化到短周期的产品研发项目和版本,每一个版本有明确的项目范围和交付功能,有明确的资源申请和资源拖入,研发的每个版本最终通过立项后要严格按项目管理的方式进行计划,执行和跟踪。
研发规划里面另外一个重点就是技术规划,很多时候我们的研发规划和技术规划是放在一起的,但是不同的产品研发往往是涉及到相同的技术和平台。那么这部分应该抽取出来,根据产品开发方法论,本身也是包括了产品,平台和技术三个层面的内容。平台层和技术层如果足够强大,那么产品本身的灵活和可配置性也越强。
资源管理和管道管理在产品组合管理里面是一个重要内容,在研发规划里面一定要考虑到对资源的需求,特别是涉及到多产品规划的时候,资源冲突往往是一个很头疼的事情。而研发资源往往又不适合在同一时间兼顾多个产品或项目。资源规划本身包括了对资源技能的要求,时间的要求和数量的要求。这些都需要提前考虑到。
产品财务规划
产品财务规划是产品战略规划和商业模式中盈利模式分析和规划内容的进一步落地。财务规划必须回答问题是产品投入多大,需要多少成本?后续盈利模式如何,需要多久能够开始盈利。是否有进一步的可持续的盈利模式,还有哪些增值点,这些都必须考虑到。
资源一定要分阶段投入,产品也最好能够分迭代版本逐步退出。要知道产品研发周期越长,那么成本投入越大,企业本身的现金流压力也就越大。公司做产品规划,做产品的目的只有一个就是合法的赚取最大化的利润。这是很正常的一个事情,一方面是回报员工和股东,一方面是公司可持续长久发展。
产品财务规划首先是产品的投资回收期和内部收益率分析,其次是产品投入预算,预算的进一步分解等。有预算后续有执行,就容易进一步的按产品核算成本和收益。对于产品推出市场,又必须考虑产品的定价策略,产品定价策略需要考虑市场本身成熟度,客户关系积累,产品本身的发展多方面信息进行完善。
摘自:http://blog.sina.com.cn/s/blog_493a84550100z0n5.html
有产品规划意识也不一定就能做出产品,特别是当我们试图从项目来驱动和衍生产品的时候,我们把项目个性化的内容误认为是产品通用化的内容,由于项目本身的短平快本身就无法形成一个通用化的产品底层模型,同时项目研发和产品研发本身又不分家,最后发现还是在做项目。
很多时候我们根本不会考虑产品规划的事情,因为我们是在做项目,客户项目化定制理所当然,那如果抱着这种思想项目始终无法转会为产品,没有产品自然无法产生应该有的产品化后的规模效应。项目型IT企业最后完全演变为IT外包企业,更谈不上企业的核心竞争力。
有产品规划意识也不一定就能做出产品,特别是当我们试图从项目来驱动和衍生产品的时候,我们把项目个性化的内容误认为是产品通用化的内容,由于项目本身的短平快本身就无法形成一个通用化的产品底层模型,同时项目研发和产品研发本身又不分家,最后发现还是在做项目。
产品规划真正要做的就是产品和项目本身的分离,产品变化为一个平台,项目变化为产品基础上的配置和实施。实施本身存在差异,但是产品平台本身可以产生强大的规模效应和底层支撑。IT企业核心竞争力最终还是体现在产品上,产品是企业核心研发能力和价值的重要体现。对于如何进行产品规划,针对IT企业而言从如下几个方面来进行说明。
背景分析和现状调研
市场驱动研发,当你无法像苹果一样引领市场的还是很,那就更好的去满足市场的需求。既然是规划,那么很多时候考虑的则是不是满足现有需求,而是要去挖掘潜在的市场需求。
背景分析重点是你规划的产品方向相关的业界标准,市场发展趋势,产品所涉及到的新技术的发展趋势等。而现状调研则是当前市场现状,现状分析越清楚越容易后续的定位和差异化。同时现状分析还不包括了我们自身的现状,包括已有的研发产品,已经涉及到的相关项目,团队人员情况等。任何规划要能落地就一定不能脱离实际。
理解市场很困难,因为市场无时无刻不在变化,很多时候需要的是要在合适的时候推出合适的产品。产品本身依托太多的外在环境,IT基础设施的发展等,太超前了是死,完全跟随也没有出路。则是必须面对的一个问题,也是产品规划不可避免的风险。但是你不能回避,没有理解清楚市场,就谈不上细分市场,产品定位和差异化等。正如我们自己,没有清楚的认识自己,就谈不上定位自己和规划自己。
产品定位分析
产品规划的核心在市场营销方法论,而市场营销核心本身又在STP(细分,目标和定位),简单来说核心在于差异化。通过差异化充分的扬长避短,发挥自己的优势。
当我们谈产品的定位的时候,又必须进一步的细化客户的需求,从客户来说我们有哪些客户和客户群,他们是如何划分的?从需求来说有哪些需求和功能要求,其各自的优先级又是如何的。市场驱动研发,从4P到4C,进一步的体现产品最大的成功就是市场销售量,要达到该目标那产品必须实现客户价值,客户价值即时产品价值。
市场和客户想清楚了,那接下来就是匹配的事情,我们的能力必须要匹配需求和能够实现需求,必须要清楚的认识到我们已有的优势和劣势,我们面对哪些竞争。SWOT看着很简单,但是真正分析到位确很困难的,因为很多时候很多是主观分析,很难有完整的数据来做支撑。蓝海里面讲价值创新,那前提是首先通过SWOT分析明确自身的差异化核心价值体现在哪里?这样才能剔除传统和不增值内容,加入新技术和创新点。
产品定位输出包括两个重要方面,一个是做什么产品,或者说做该产品的里面的那一个更加具体的类型,该产品的核心功能必须有哪些?另外一个即是产品的目标市场或客户是谁,目标客户是否足够细分? 很多时候我们老想做一款通吃的产品,到后面导致产品大量的定制和膨胀,最终产品又变成了定制项目。
产品总体规划
切合前面的市场分析和产品定位,那么我们产品规划目标和产品发展愿景是什么?产品愿景将进一步回答产品的核心价值所在。产品愿景是我们期望产品是什么样子,遵循一个什么样的发展路线,解决哪些客户的核心问题以体现核心价值。产品愿景可以看得更加长远点,超过3年或者更长时间,虽然存在太多的不确定性,但是我们仍然要有一个清晰的愿景。正如你想把你的孩子培养成什么样一个人一样,必须有一个大方向和愿景。
产品愿景和大方向清楚了,接下来才是分阶段的规划,或者叫路标规划,路标规划让我们对一个长时间周期的规划有了一个更加清楚的里程碑,这是产品规划内容最粗粒度的一个落地考虑。有了路标,我们的航线更加清晰,要达到最终的大目标我们就必须一个个小路标一步步的走过来。
路标规划是一个长时间周期规划,3-5年甚至更长时间,那这个想清楚了接下来就要考虑最近1-2年如何做?最近3-6个月如何做?这一步需要更加详细的规划,以方便实施和落地。在现在互联网时代,产品研发也必须敏捷,短周期迭代,以应对变化和进行调整。
一个是如何做和做哪些?那么另外一个重要的就是如何推和如何实施?我们在做之前相关的市场规划策划,产品方案等工作就必须开始和并行。产品研发和市场工作并行,而不是等产品真正出来了才考虑如何推广。
产品研发规划
研发规划离我们就很近了,首先研发规划的输入应该是产品规划或产品年度规划,产品年度规划的内容需要通过产品研发规划落地。研发规划可以理解成大的项目计划,那自然应该包括项目范围和需求收集,需求分析和优先级的评估,研发资源的投入和成本,研发功能点,研发进度计划。如果存在多个子产品,还必须考虑研发产品组合规划,然后才是子产品的研发计划。
研发计划需要进一步细化到短周期的产品研发项目和版本,每一个版本有明确的项目范围和交付功能,有明确的资源申请和资源拖入,研发的每个版本最终通过立项后要严格按项目管理的方式进行计划,执行和跟踪。
研发规划里面另外一个重点就是技术规划,很多时候我们的研发规划和技术规划是放在一起的,但是不同的产品研发往往是涉及到相同的技术和平台。那么这部分应该抽取出来,根据产品开发方法论,本身也是包括了产品,平台和技术三个层面的内容。平台层和技术层如果足够强大,那么产品本身的灵活和可配置性也越强。
资源管理和管道管理在产品组合管理里面是一个重要内容,在研发规划里面一定要考虑到对资源的需求,特别是涉及到多产品规划的时候,资源冲突往往是一个很头疼的事情。而研发资源往往又不适合在同一时间兼顾多个产品或项目。资源规划本身包括了对资源技能的要求,时间的要求和数量的要求。这些都需要提前考虑到。
产品财务规划
产品财务规划是产品战略规划和商业模式中盈利模式分析和规划内容的进一步落地。财务规划必须回答问题是产品投入多大,需要多少成本?后续盈利模式如何,需要多久能够开始盈利。是否有进一步的可持续的盈利模式,还有哪些增值点,这些都必须考虑到。
资源一定要分阶段投入,产品也最好能够分迭代版本逐步退出。要知道产品研发周期越长,那么成本投入越大,企业本身的现金流压力也就越大。公司做产品规划,做产品的目的只有一个就是合法的赚取最大化的利润。这是很正常的一个事情,一方面是回报员工和股东,一方面是公司可持续长久发展。
产品财务规划首先是产品的投资回收期和内部收益率分析,其次是产品投入预算,预算的进一步分解等。有预算后续有执行,就容易进一步的按产品核算成本和收益。对于产品推出市场,又必须考虑产品的定价策略,产品定价策略需要考虑市场本身成熟度,客户关系积累,产品本身的发展多方面信息进行完善。
摘自:http://blog.sina.com.cn/s/blog_493a84550100z0n5.html
[实践OK]u盘制作启动盘后空间容量变小解决方法
Unix/LinuxC技术 jackxiang 2014-11-15 20:56
背景:前两天搞那个笔记本光驱位启动偶尔出现启动不对,给试着做了一个U盘作为启动盘后,发现插入后,只有8M。
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>diskpart
Microsoft DiskPart 版本 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
在计算机上: USER-2S1CISV9DB
DISKPART> list disk
磁盘 ### 状态 大小 可用 Dyn Gpt
-------- ------------- ------- ------- --- ---
磁盘 0 联机 119 GB 8 MB
磁盘 1 联机 465 GB 1024 KB
磁盘 2 联机 3840 MB 64 KB
DISKPART> select disk 2
磁盘 2 现在是所选磁盘。
DISKPART> clean
DiskPart 成功地清除了磁盘。
DISKPART>
第二步,不能直接在盘符上点格式化,是格式化不了的。
右击计算机,选择管理,进入磁盘管理,能看到u盘分区是未分配(黑色),右击,新建分区,后格式化,一直下一步就OK了。
参考:http://wenku.baidu.com/link?url=GdwdGJFfmxY-cWkAjf0nuUMxehOILyFnc20iwmUNtsF-FIG_WttKC4BSiiC1FKAx2ls9P3DoXJ1pME7VOyhr4_arATMkqMdCuL0wMv3bZLW
摘自:http://jingyan.baidu.com/article/b24f6c82dddece86bee5da67.html
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>diskpart
Microsoft DiskPart 版本 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
在计算机上: USER-2S1CISV9DB
DISKPART> list disk
磁盘 ### 状态 大小 可用 Dyn Gpt
-------- ------------- ------- ------- --- ---
磁盘 0 联机 119 GB 8 MB
磁盘 1 联机 465 GB 1024 KB
磁盘 2 联机 3840 MB 64 KB
DISKPART> select disk 2
磁盘 2 现在是所选磁盘。
DISKPART> clean
DiskPart 成功地清除了磁盘。
DISKPART>
第二步,不能直接在盘符上点格式化,是格式化不了的。
右击计算机,选择管理,进入磁盘管理,能看到u盘分区是未分配(黑色),右击,新建分区,后格式化,一直下一步就OK了。
参考:http://wenku.baidu.com/link?url=GdwdGJFfmxY-cWkAjf0nuUMxehOILyFnc20iwmUNtsF-FIG_WttKC4BSiiC1FKAx2ls9P3DoXJ1pME7VOyhr4_arATMkqMdCuL0wMv3bZLW
摘自:http://jingyan.baidu.com/article/b24f6c82dddece86bee5da67.html
[实践OK]php的coredump怎么看?段错误等造成死机问题的分析, apache的coredump文件及其它像swoole这样的出现崩溃查找问题在哪行的原理。
Unix/LinuxC技术 jackxiang 2014-11-14 16:58
设置一下吐核,按Swoole官方的Wiki教程,设置一下吐核,From: https://wiki.swoole.com/wiki/page/10.html :
一、开启CoreDump:
ulimit -c #查看
#ulimit -c unlimited
使用gdb来查看core dump信息。core文件一般在当前目录,如果操作系统做了处理,将core dump文件放置到其他目录,请替换为相应的路径
二、设置内核参数将吐的核放到指定目录下指定格式存放:
kernel.core_pattern = /data/core_files/core-%e-%p-%t
通过ulimit -c命令查看当前coredump文件的限制
ulimit -c
打开core dump
ulimit -c unlimited
三、调试:
#gdb /usr/bin/httpd core.123
gdb /usr/local/nginx/sbin/nginx core.456
四、在GDB里使用bt命令调试等:
在gdb下输入bt查看调用栈信息
(gdb)bt
Program terminated with signal 11, Segmentation fault.
#0 0x00007f1cdbe205e0 in swServer_onTimer (reactor=<value optimized out>, event=...)
at /usr/local/php/swoole-swoole-1.5.9b/src/network/Server.c:92
92 serv->onTimer(serv, timer_node->interval);
Missing separate debuginfos, use: debuginfo-install php-cli-5.3.3-22.el6.x86_64
在gdb中使用f指令查看代码段
(gdb)f 1
(gdb)f 0
五、像这种退出不是段错误,没有Coredump的:
==> /data/logs/nginx/error.log <==
2017/08/16 11:56:52 [notice] 41234#0: signal 17 (SIGCHLD) received
2017/08/16 11:56:52 [notice] 41234#0: worker process 41237 exited with code 2
2017/08/16 11:56:52 [alert] 41234#0: worker process 41237 exited with fatal code 2 and cannot be respawned
2017/08/16 11:56:52 [notice] 41234#0: signal 29 (SIGIO) received
2017/08/16 11:56:52 [emerg] 41236#0: load ip map file error: /usr/local/nginx/conf/ip.map
2017/08/16 11:56:52 [notice] 41234#0: signal 17 (SIGCHLD) received
2017/08/16 11:56:52 [notice] 41234#0: worker process 41236 exited with code 2
2017/08/16 11:56:52 [alert] 41234#0: worker process 41236 exited with fatal code 2 and cannot be respawned
原因是:一个文件不存在,故意移动了下:
mv /usr/local/nginx/conf/ip.map /usr/local/nginx/conf/ip.map.bak
===================================================================================
使用gdb来查看core dump信息。core文件一般在当前目录,如果操作系统做了处理,将core dump文件放置到其他目录,请替换为相应的路径
gdb php core
gdb php /tmp/core.4596
在gdb下输入bt查看调用栈信息
(gdb)bt
Program terminated with signal 11, Segmentation fault.
#0 0x00007f1cdbe205e0 in swServer_onTimer (reactor=<value optimized out>, event=...)
at /usr/local/php/swoole-swoole-1.5.9b/src/network/Server.c:92
92 serv->onTimer(serv, timer_node->interval);
Missing separate debuginfos, use: debuginfo-install php-cli-5.3.3-22.el6.x86_64
在gdb中使用f指令查看代码段
(gdb)f 1
(gdb)f 0
对gdb下f命令的实践,能显示哪一行出了问题:
(gdb) bt
#0 0x00007ffff7b01980 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1 0x00007ffff7a924a0 in _IO_new_file_underflow (fp=0x7ffff7dd5640 <_IO_2_1_stdin_>) at fileops.c:612
#2 0x00007ffff7a9342e in __GI__IO_default_uflow (fp=0x7ffff7dd5640 <_IO_2_1_stdin_>) at genops.c:436
#3 0x00007ffff7a753b3 in _IO_vfscanf_internal (s=<optimized out>, format=<optimized out>, argptr=argptr@entry=0x7fffffffe368, errp=errp@entry=0x0) at vfscanf.c:600
#4 0x00007ffff7a83a19 in __isoc99_scanf (format=<optimized out>) at isoc99_scanf.c:37
#5 0x00000000004006d4 in creat () at nodedemo.c:24
#6 0x000000000040075b in main () at nodedemo.c:46
(gdb) f 5
#5 0x00000000004006d4 in creat () at nodedemo.c:24
24 }
(gdb) f 2
#2 0x00007ffff7a9342e in __GI__IO_default_uflow (fp=0x7ffff7dd5640 <_IO_2_1_stdin_>) at genops.c:436
436 int ch = _IO_UNDERFLOW (fp);
如果为0,需要修改/etc/security/limits.conf,进行limit设置。
开启core-dump后,一旦程序发生异常,会将进程导出到文件。对于调查程序问题有很大的帮助
来自:http://wiki.swoole.com/wiki/page/10.html http://wiki.swoole.com/wiki/page/11.html
—————————————————————————————————————————————
记录一下。
1. ulimit -S -c unlimited
2. 在apache主配置文件中增加一行:CoreDumpDirectory /var/apache_coredump #目录随意
3. chown修改/var/apache_coredump的权限为apache子进程可写
注意:不要开启太久,core文件太多。占用太多磁盘空间
调试
gdb /usr/bin/httpd core.123
apache的coredump
来自:http://5iwww.blog.51cto.com/856039/761077
阅读全文
一、开启CoreDump:
ulimit -c #查看
#ulimit -c unlimited
使用gdb来查看core dump信息。core文件一般在当前目录,如果操作系统做了处理,将core dump文件放置到其他目录,请替换为相应的路径
二、设置内核参数将吐的核放到指定目录下指定格式存放:
kernel.core_pattern = /data/core_files/core-%e-%p-%t
通过ulimit -c命令查看当前coredump文件的限制
ulimit -c
打开core dump
ulimit -c unlimited
三、调试:
#gdb /usr/bin/httpd core.123
gdb /usr/local/nginx/sbin/nginx core.456
四、在GDB里使用bt命令调试等:
在gdb下输入bt查看调用栈信息
(gdb)bt
Program terminated with signal 11, Segmentation fault.
#0 0x00007f1cdbe205e0 in swServer_onTimer (reactor=<value optimized out>, event=...)
at /usr/local/php/swoole-swoole-1.5.9b/src/network/Server.c:92
92 serv->onTimer(serv, timer_node->interval);
Missing separate debuginfos, use: debuginfo-install php-cli-5.3.3-22.el6.x86_64
在gdb中使用f指令查看代码段
(gdb)f 1
(gdb)f 0
五、像这种退出不是段错误,没有Coredump的:
==> /data/logs/nginx/error.log <==
2017/08/16 11:56:52 [notice] 41234#0: signal 17 (SIGCHLD) received
2017/08/16 11:56:52 [notice] 41234#0: worker process 41237 exited with code 2
2017/08/16 11:56:52 [alert] 41234#0: worker process 41237 exited with fatal code 2 and cannot be respawned
2017/08/16 11:56:52 [notice] 41234#0: signal 29 (SIGIO) received
2017/08/16 11:56:52 [emerg] 41236#0: load ip map file error: /usr/local/nginx/conf/ip.map
2017/08/16 11:56:52 [notice] 41234#0: signal 17 (SIGCHLD) received
2017/08/16 11:56:52 [notice] 41234#0: worker process 41236 exited with code 2
2017/08/16 11:56:52 [alert] 41234#0: worker process 41236 exited with fatal code 2 and cannot be respawned
原因是:一个文件不存在,故意移动了下:
mv /usr/local/nginx/conf/ip.map /usr/local/nginx/conf/ip.map.bak
===================================================================================
使用gdb来查看core dump信息。core文件一般在当前目录,如果操作系统做了处理,将core dump文件放置到其他目录,请替换为相应的路径
gdb php core
gdb php /tmp/core.4596
在gdb下输入bt查看调用栈信息
(gdb)bt
Program terminated with signal 11, Segmentation fault.
#0 0x00007f1cdbe205e0 in swServer_onTimer (reactor=<value optimized out>, event=...)
at /usr/local/php/swoole-swoole-1.5.9b/src/network/Server.c:92
92 serv->onTimer(serv, timer_node->interval);
Missing separate debuginfos, use: debuginfo-install php-cli-5.3.3-22.el6.x86_64
在gdb中使用f指令查看代码段
(gdb)f 1
(gdb)f 0
对gdb下f命令的实践,能显示哪一行出了问题:
(gdb) bt
#0 0x00007ffff7b01980 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1 0x00007ffff7a924a0 in _IO_new_file_underflow (fp=0x7ffff7dd5640 <_IO_2_1_stdin_>) at fileops.c:612
#2 0x00007ffff7a9342e in __GI__IO_default_uflow (fp=0x7ffff7dd5640 <_IO_2_1_stdin_>) at genops.c:436
#3 0x00007ffff7a753b3 in _IO_vfscanf_internal (s=<optimized out>, format=<optimized out>, argptr=argptr@entry=0x7fffffffe368, errp=errp@entry=0x0) at vfscanf.c:600
#4 0x00007ffff7a83a19 in __isoc99_scanf (format=<optimized out>) at isoc99_scanf.c:37
#5 0x00000000004006d4 in creat () at nodedemo.c:24
#6 0x000000000040075b in main () at nodedemo.c:46
(gdb) f 5
#5 0x00000000004006d4 in creat () at nodedemo.c:24
24 }
(gdb) f 2
#2 0x00007ffff7a9342e in __GI__IO_default_uflow (fp=0x7ffff7dd5640 <_IO_2_1_stdin_>) at genops.c:436
436 int ch = _IO_UNDERFLOW (fp);
如果为0,需要修改/etc/security/limits.conf,进行limit设置。
开启core-dump后,一旦程序发生异常,会将进程导出到文件。对于调查程序问题有很大的帮助
来自:http://wiki.swoole.com/wiki/page/10.html http://wiki.swoole.com/wiki/page/11.html
—————————————————————————————————————————————
记录一下。
1. ulimit -S -c unlimited
2. 在apache主配置文件中增加一行:CoreDumpDirectory /var/apache_coredump #目录随意
3. chown修改/var/apache_coredump的权限为apache子进程可写
注意:不要开启太久,core文件太多。占用太多磁盘空间
调试
gdb /usr/bin/httpd core.123
apache的coredump
来自:http://5iwww.blog.51cto.com/856039/761077
阅读全文
curl是Linux下一个非常著名的下载库,通过这个库,可以很简单的实现文件的下载等操作。
一、看一个简单的例子(学习其用static字符串数组和指针的返回判断这块值得学习并记住):
二、分为header和包体数据两个回调指针:
整个代码如下:
From:
http://www.ithao123.cn/content-1085192.html
curl连接超时的问题:
CURLOPT_TIMEOUT 设置cURL允许执行的最长秒数。
CURLOPT_TIMEOUT_MS 设置cURL允许执行的最长毫秒数。
CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS 尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT 与 CURLOPT_CONNECTTIMEOUT_MS 类似,可以理解成等待连接成功创建的时间.
来自:http://blog.chinaunix.net/uid-2270658-id-302245.html
超时这一块还应该注意在不同的curl里存在毫秒,而上线后可能curl版本较低不支持毫秒,于是出现没有发出请求的问题:
来自:http://www.vimer.cn/2012/01/%E5%85%B3%E4%BA%8Elibcurl%E4%B8%8D%E5%8F%91%E5%8C%85%E7%9A%84bug%E5%AE%9A%E4%BD%8D.html
使用libcurl库可以实现HTTP和FTP的请求,以前对http协议进行过学习,但一直无法很好的解决阻塞问题,认识了libcurl后方觉相见恨晚,因为http阻塞的问题已经困扰了我两年了。
虽然编译出来的libcurl.lib足有700多K,但libcurl库的使用却很简单,只有熟悉curl_easy_setopt这个函数就可以了。该函数的作用是设置请求的相关参数来让curl构造协议头或返回指定的数据。
//返回HTTP协议头
curl_easy_setopt( curl, CURLOPT_HEADER, 1 );
//超时设置(单位:秒),如果在指定时间内没数据可接收则超时
curl_easy_setopt( curl, CURLOPT_TIMEOUT, 3 );
//连接超时,不过只适用于Unix系统,Windows系统应该就是使用CURLOPT_TIMEOUT
curl_easy_setopt( curl, CONNECTTIMEOUT, 3 );
//设置请求Cookie
curl_easy_setopt( curl, CURLOPT_COOKIE, cookie );
//返回Cookie
curl_easy_setopt( curl, CURLOPT_COOKIEJAR, cookie );
来自:http://blog.chinaunix.net/uid-2270658-id-247815.html
阅读全文
一、看一个简单的例子(学习其用static字符串数组和指针的返回判断这块值得学习并记住):
二、分为header和包体数据两个回调指针:
整个代码如下:
From:
http://www.ithao123.cn/content-1085192.html
curl连接超时的问题:
CURLOPT_TIMEOUT 设置cURL允许执行的最长秒数。
CURLOPT_TIMEOUT_MS 设置cURL允许执行的最长毫秒数。
CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS 尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT 与 CURLOPT_CONNECTTIMEOUT_MS 类似,可以理解成等待连接成功创建的时间.
来自:http://blog.chinaunix.net/uid-2270658-id-302245.html
超时这一块还应该注意在不同的curl里存在毫秒,而上线后可能curl版本较低不支持毫秒,于是出现没有发出请求的问题:
来自:http://www.vimer.cn/2012/01/%E5%85%B3%E4%BA%8Elibcurl%E4%B8%8D%E5%8F%91%E5%8C%85%E7%9A%84bug%E5%AE%9A%E4%BD%8D.html
使用libcurl库可以实现HTTP和FTP的请求,以前对http协议进行过学习,但一直无法很好的解决阻塞问题,认识了libcurl后方觉相见恨晚,因为http阻塞的问题已经困扰了我两年了。
虽然编译出来的libcurl.lib足有700多K,但libcurl库的使用却很简单,只有熟悉curl_easy_setopt这个函数就可以了。该函数的作用是设置请求的相关参数来让curl构造协议头或返回指定的数据。
//返回HTTP协议头
curl_easy_setopt( curl, CURLOPT_HEADER, 1 );
//超时设置(单位:秒),如果在指定时间内没数据可接收则超时
curl_easy_setopt( curl, CURLOPT_TIMEOUT, 3 );
//连接超时,不过只适用于Unix系统,Windows系统应该就是使用CURLOPT_TIMEOUT
curl_easy_setopt( curl, CONNECTTIMEOUT, 3 );
//设置请求Cookie
curl_easy_setopt( curl, CURLOPT_COOKIE, cookie );
//返回Cookie
curl_easy_setopt( curl, CURLOPT_COOKIEJAR, cookie );
来自:http://blog.chinaunix.net/uid-2270658-id-247815.html
阅读全文
背景:以为微信用的是websocket,试一下想抓包看下。
现在做网页游戏开发的同学,肯定会使用到WebSocket来通讯,毕竟相对于长轮询和iFrame等方式,WebSocket给我们开了一扇大门,更简单快捷。
首先,HTTP是建立在TCP协议基础上的,而WebSocket通常也是建立在TCP上,所以说为什么有些网页游戏抓不到包而有些又可以,这仅是因为你使用的抓包工具是针对了HTTP的通信协议。
我先从抽象的层面,举一个可能不太恰当的例子,只为了让不明白HTTP和WebSocket两者之间抓包有何区别的同学大概了解这两个协议的异同。客户端/服务端用C/S简称,我把数据抽象成水流,而HTTP是用水枪传递水流的(无状态),至于WEBSOCKET则是使用水管传递水流(实时)。
HTTP通讯方式:
客户端C把数据封装好了要交给服务端S,所以把水放到水枪里面,射过去给S
S用桶把水挡下来了,然后分析水的成分(数据内容),完成后再把新的水(返回的数据)射回去给C
这个过程中,任何人都可以随时在C和S之间用海绵吸一点水然后拿去分析(嗅探数据),或者是直接用桶把水都挡下来分析完后再装到水枪中,模仿C的动作射给S(也就是代理抓包)
WEBSOCKET方式:
客户端C和服务端S,双方之间先用一条水管连起来(用的是HTTP握手),然后水流都通过这个小水管来传输
水管里面一直有水在流动,所以要通讯只需要C或者是S把数据水流放到水管中,则会立刻传输到对方那边
这个过程中,要嗅探就比较麻烦了,需要先在水管中先打个洞,然后再把分析器放进去、或者是斩断这个水管在中间接个水表之类的设备去分析水质成分
好了,乱说一通完毕,说一下抓取WebSocket的两个工具,都是常见的程序,只是可能很多同学不清楚有这样的功能而已。
第一个:Chrome,也就是谷歌的浏览器
进入你要抓包的网页,然后按F12打开我们最爱的开发者工具
然后点Network,再从过滤器中找到WebSockets(上方或下方的状态栏)
选中过滤出来的WebSocket,在弹出来的右边栏中可以找到Frames,里面就是抓到的包
如果要看新通讯产生的数据包,则要先点其他的位置比如Headers再点Frames才可以刷新
第二个:Fiddler,抓包调试的利器,已经人手一个了吧
打开Fiddler,点开菜单栏的Rules,选择Customize Rules...
这时会打开CustomRules.js文件,在class Handlers中加入以下代码
static function OnWebSocketMessage(oMsg: WebSocketMessage) {
// Log Message to the LOG tab
FiddlerApplication.Log.LogString(oMsg.ToString());
}
保存后就可以在Fiddler右边栏的Log标签里,看到WebSocket的数据包
到了这里,还有一个情况要说明,就算是有工具可以抓到WebSocket中的包,看到的也不一定是明文。这个要看传输的水是什么,如果是普通水那谁都可以分析;但如果是水银,那这个分析水的设备很可能就显示乱码了。 所以也就有同学明明使用了可以抓WebSocket包的程序,却抓出来的是乱码。那是因为别人传输的是二进制数据流(比如AMF包),而不是JSON之类的对人类可读的明文。
参考资料:
Debug Inspect WebSocket traffic with Fiddler 【荐】
Logging WebSocket Frames using Chrome Developer Tools, Net-internals and Wireshark
原始链接: http://blog.jtwo.me/post/use-chrome-or-fiddler-sniffer-websocket
现在做网页游戏开发的同学,肯定会使用到WebSocket来通讯,毕竟相对于长轮询和iFrame等方式,WebSocket给我们开了一扇大门,更简单快捷。
首先,HTTP是建立在TCP协议基础上的,而WebSocket通常也是建立在TCP上,所以说为什么有些网页游戏抓不到包而有些又可以,这仅是因为你使用的抓包工具是针对了HTTP的通信协议。
我先从抽象的层面,举一个可能不太恰当的例子,只为了让不明白HTTP和WebSocket两者之间抓包有何区别的同学大概了解这两个协议的异同。客户端/服务端用C/S简称,我把数据抽象成水流,而HTTP是用水枪传递水流的(无状态),至于WEBSOCKET则是使用水管传递水流(实时)。
HTTP通讯方式:
客户端C把数据封装好了要交给服务端S,所以把水放到水枪里面,射过去给S
S用桶把水挡下来了,然后分析水的成分(数据内容),完成后再把新的水(返回的数据)射回去给C
这个过程中,任何人都可以随时在C和S之间用海绵吸一点水然后拿去分析(嗅探数据),或者是直接用桶把水都挡下来分析完后再装到水枪中,模仿C的动作射给S(也就是代理抓包)
WEBSOCKET方式:
客户端C和服务端S,双方之间先用一条水管连起来(用的是HTTP握手),然后水流都通过这个小水管来传输
水管里面一直有水在流动,所以要通讯只需要C或者是S把数据水流放到水管中,则会立刻传输到对方那边
这个过程中,要嗅探就比较麻烦了,需要先在水管中先打个洞,然后再把分析器放进去、或者是斩断这个水管在中间接个水表之类的设备去分析水质成分
好了,乱说一通完毕,说一下抓取WebSocket的两个工具,都是常见的程序,只是可能很多同学不清楚有这样的功能而已。
第一个:Chrome,也就是谷歌的浏览器
进入你要抓包的网页,然后按F12打开我们最爱的开发者工具
然后点Network,再从过滤器中找到WebSockets(上方或下方的状态栏)
选中过滤出来的WebSocket,在弹出来的右边栏中可以找到Frames,里面就是抓到的包
如果要看新通讯产生的数据包,则要先点其他的位置比如Headers再点Frames才可以刷新
第二个:Fiddler,抓包调试的利器,已经人手一个了吧
打开Fiddler,点开菜单栏的Rules,选择Customize Rules...
这时会打开CustomRules.js文件,在class Handlers中加入以下代码
static function OnWebSocketMessage(oMsg: WebSocketMessage) {
// Log Message to the LOG tab
FiddlerApplication.Log.LogString(oMsg.ToString());
}
保存后就可以在Fiddler右边栏的Log标签里,看到WebSocket的数据包
到了这里,还有一个情况要说明,就算是有工具可以抓到WebSocket中的包,看到的也不一定是明文。这个要看传输的水是什么,如果是普通水那谁都可以分析;但如果是水银,那这个分析水的设备很可能就显示乱码了。 所以也就有同学明明使用了可以抓WebSocket包的程序,却抓出来的是乱码。那是因为别人传输的是二进制数据流(比如AMF包),而不是JSON之类的对人类可读的明文。
参考资料:
Debug Inspect WebSocket traffic with Fiddler 【荐】
Logging WebSocket Frames using Chrome Developer Tools, Net-internals and Wireshark
原始链接: http://blog.jtwo.me/post/use-chrome-or-fiddler-sniffer-websocket