并发数 和 TPS 有什么联系吗?
Unix/LinuxC技术 jack 2014-2-26 13:35
背景:昨天一QQ群里的兄弟问了个问题:并发数 和 TPS 有什么联系吗?我在微信里作了下简单回答如下,顺带今天了解下其它参数。
TPS 是Transactions Per Second 的 缩 写, 也 就 是 事 务 数/ 秒。 它 是软件测试结 果 的 测 量 单 位。 一 个 事 务 是 指 一 个 客 户 机 向 服 务 器 发 送 请 求 然 后 服 务 器 做 出 反 应 的 过 程。 客 户 机 在 发 送 请 求 时 开 始 计 时, 收 到 服 务 器 响 应 后 结 束 计 时, 以 此 来 计 算 使 用 的 时 间 和 完 成 的 事 务 个 数, 最 终 利 用 这 些 信 息 来 估 计 得 分。 客 户 机 使 用 加 权 协 函 数 平 均 方 法 来 计 算 客 户 机 的得 分,测试软件就是 利 用 客 户 机 的 这 些 信 息 使 用 加 权 协 函 数 平 均 方 法 来 计 算 服 务 器 端 的 整 体TPS 得 分。
如求TPS,例子,一个软件测试以并发2000,发现其经过1分钟后软件给出Response Time(sec)一条曲线,在0.2左右。
此时TPS=并发数/平均响应时间(平均)=2000/0.2 = 10000,1w并发,也就是说能接受1万的并发值,注意是平均响应。
阅读全文
TPS 是Transactions Per Second 的 缩 写, 也 就 是 事 务 数/ 秒。 它 是软件测试结 果 的 测 量 单 位。 一 个 事 务 是 指 一 个 客 户 机 向 服 务 器 发 送 请 求 然 后 服 务 器 做 出 反 应 的 过 程。 客 户 机 在 发 送 请 求 时 开 始 计 时, 收 到 服 务 器 响 应 后 结 束 计 时, 以 此 来 计 算 使 用 的 时 间 和 完 成 的 事 务 个 数, 最 终 利 用 这 些 信 息 来 估 计 得 分。 客 户 机 使 用 加 权 协 函 数 平 均 方 法 来 计 算 客 户 机 的得 分,测试软件就是 利 用 客 户 机 的 这 些 信 息 使 用 加 权 协 函 数 平 均 方 法 来 计 算 服 务 器 端 的 整 体TPS 得 分。
如求TPS,例子,一个软件测试以并发2000,发现其经过1分钟后软件给出Response Time(sec)一条曲线,在0.2左右。
此时TPS=并发数/平均响应时间(平均)=2000/0.2 = 10000,1w并发,也就是说能接受1万的并发值,注意是平均响应。
阅读全文
[实践OK]C语言中获得系统当前的日期和时间
Unix/LinuxC技术 jack 2014-2-8 16:56
C语言中获得系统当前的日期和时间
一、代码如下:
二、执行如下:
[root@test http_pcap_codes]# ./a.out
Year: 2014
Month: 2
Day: 8
Hour: 16
Minute: 55
Second: 9
Weekday: 6
Days: 38
Isdst: 0
上面的这些日期可以通过c函数连接起来实现:20140208 的按时间的目录结构
原代码来自里面localtime写错了:
http://www.linuxidc.com/Linux/2012-07/65059.htm
直接整数转也成:
snprintf(szValue,100,"%04d%02d%02d",1900+p->tm_year,1+p->tm_mon,p->tm_mday);
printf("%s",szValue)
整数转为char后再进行snprintf转代码%s(简单示例),snprintf参考:http://jackxiang.com/post/3736/
一、代码如下:
二、执行如下:
[root@test http_pcap_codes]# ./a.out
Year: 2014
Month: 2
Day: 8
Hour: 16
Minute: 55
Second: 9
Weekday: 6
Days: 38
Isdst: 0
上面的这些日期可以通过c函数连接起来实现:20140208 的按时间的目录结构
原代码来自里面localtime写错了:
http://www.linuxidc.com/Linux/2012-07/65059.htm
直接整数转也成:
snprintf(szValue,100,"%04d%02d%02d",1900+p->tm_year,1+p->tm_mon,p->tm_mday);
printf("%s",szValue)
整数转为char后再进行snprintf转代码%s(简单示例),snprintf参考:http://jackxiang.com/post/3736/
TortoiseSVN使用Repository UUID doesn't match expected 解决办法,TortoiseSVN 修改服务器地址url,uuid冲突。
Unix/LinuxC技术 jack 2014-2-8 10:54
操作TortoiseSVN时,报如下错误:
Command Update
Repository UUID 'xxxxxxxx' doesn't match expected
UUID 'xxxxxxxx'
Finished!
这个在windows下是看不到uuid的,但是在Linux下的svn client是能看到的,分别讲下在哪儿:
1)Windows下的小乌龟是在.svn/wc.db里能找到,但是不报错这个是没法直接查到的,打开这个db文件搜索下svn的http地址内容就在它旁边能找到uuid,长得像这样,里而且多个一样的URL,这样不太好找:9b35ebc1-e2f0-4571-a2aa-cca3a5a3be64。
2)Linux下可直接用svn info能获取到,如svn info svn目录,或svn info svn的http地址信息。
sha1$e059139d119b69af6510ac5971fcfb4aa3bbbc64
可以看到,原来Repository创建者的UUID是前者,而现在所操作的是后者的UUID。因此,目前的解决办法是:使用相关命令更新Repository的UUID。
具体办法如下:
1、首先查看项目的所有者的UUID
# svnlook uuid /var/svn/repos
xxxxxxx
2、更新项目的UUID
# svnadmin setuuid /var/svn/repos xxxxxxx
3、查看一下更新后的UUID
# svnlook uuid /var/svn/repos
是在linux下的tortoise服务器的仓库里面看,如下:
/usr/local/subversion/bin/svnlook uuid /data/subversion/levoo
400fc8d2-0ce3-4270-bfba-d81f7d67c23b
附:
UUID是repository创建时自动生成的一个随机数, SVN Client利用UUID判断是否为同一个resp。一般遇到UUID不同时,需要重新checkout
摘自:http://blog.csdn.net/xuzhuang2008/article/details/8474229
1. 客户端 在工作目录上右键-> TortoiseSVN-> 重新定位(Relocate)
2. 如果显示 uuid冲突时, 先显示现有版本,再设置新的id。
服务器在项目上右键->所有任务->start Command Prompt
H:\backup\DS9000>svnlook uuid .
3219074f-d8da-2248-814a-399c5442be0a
H:\backup\DS9000>svnadmin setuuid . a3880bf4-0eb5-d74c-8d1e-3d6c595fa54e
H:\backup\DS9000>svnlook uuid .
a3880bf4-0eb5-d74c-8d1e-3d6c595fa54e
来自:http://blog.sina.com.cn/s/blog_727b5d7c0100ogo1.html
Command Update
Repository UUID 'xxxxxxxx' doesn't match expected
UUID 'xxxxxxxx'
Finished!
这个在windows下是看不到uuid的,但是在Linux下的svn client是能看到的,分别讲下在哪儿:
1)Windows下的小乌龟是在.svn/wc.db里能找到,但是不报错这个是没法直接查到的,打开这个db文件搜索下svn的http地址内容就在它旁边能找到uuid,长得像这样,里而且多个一样的URL,这样不太好找:9b35ebc1-e2f0-4571-a2aa-cca3a5a3be64。
2)Linux下可直接用svn info能获取到,如svn info svn目录,或svn info svn的http地址信息。
sha1$e059139d119b69af6510ac5971fcfb4aa3bbbc64
可以看到,原来Repository创建者的UUID是前者,而现在所操作的是后者的UUID。因此,目前的解决办法是:使用相关命令更新Repository的UUID。
具体办法如下:
1、首先查看项目的所有者的UUID
# svnlook uuid /var/svn/repos
xxxxxxx
2、更新项目的UUID
# svnadmin setuuid /var/svn/repos xxxxxxx
3、查看一下更新后的UUID
# svnlook uuid /var/svn/repos
是在linux下的tortoise服务器的仓库里面看,如下:
/usr/local/subversion/bin/svnlook uuid /data/subversion/levoo
400fc8d2-0ce3-4270-bfba-d81f7d67c23b
附:
UUID是repository创建时自动生成的一个随机数, SVN Client利用UUID判断是否为同一个resp。一般遇到UUID不同时,需要重新checkout
摘自:http://blog.csdn.net/xuzhuang2008/article/details/8474229
1. 客户端 在工作目录上右键-> TortoiseSVN-> 重新定位(Relocate)
2. 如果显示 uuid冲突时, 先显示现有版本,再设置新的id。
服务器在项目上右键->所有任务->start Command Prompt
H:\backup\DS9000>svnlook uuid .
3219074f-d8da-2248-814a-399c5442be0a
H:\backup\DS9000>svnadmin setuuid . a3880bf4-0eb5-d74c-8d1e-3d6c595fa54e
H:\backup\DS9000>svnlook uuid .
a3880bf4-0eb5-d74c-8d1e-3d6c595fa54e
来自:http://blog.sina.com.cn/s/blog_727b5d7c0100ogo1.html
介绍一个linux下生成C代码调用树的好工具calltree
Unix/LinuxC技术 jack 2014-2-7 17:50
Error while loading shared libraries: libcap.so.1: cannot open shared object file
Unix/LinuxC技术 jack 2014-1-27 15:36
背景:而我的情况是因为强行卸载了rpm -e libcap-devel-1.10-26 --allmatches --nodeps 后,
导致:Error while loading shared libraries: libcap.so.1: cannot open shared object file 。
[root@test http_pcap_codes]# rpm -qa|grep libcap
libcap-1.10-26
libcap-devel-1.10-26
libcap-1.10-26
libcap-devel-1.10-26
发现有两个一样的包,我就强制卸载rpm包遭遇error: specifies multiple packages,
rpm -e libcap-devel-1.10-26
error: "libcap-devel-1.10-26" specifies multiple packages,后强制采用了:
rpm -e libcap-1.10-26 --allmatches --nodeps 卸载后,root sudo的时候,登录提示:
Error while loading shared libraries: libcap.so.1: cannot open shared object file !
还好及时发现,后又安上了,一查原来还真有这个libcap.so.1,如下:
[root@test dbus-1.8.0]# rpm -ql libcap-1.10-26|grep libcap.so.1
/lib64/libcap.so.1
/lib64/libcap.so.1.10
/lib/libcap.so.1
/lib/libcap.so.1.10
也就是说明,这个Linux的sudo会用这个了,了解。
——————————————————
安装了CentOS6.4,发现里面有很多默认安装的软件都不需要,比如mysql,apache,php等等,用rpm -e xxxx卸载,发现不好用,man rpm看了下,有个强制卸载的选项:
–allmatches
Remove all versions of the package which match PACKAGE_NAME. Normally an error is issued if PACKAGE_NAME matches
multiple packages.
rpm -e --allmatches --nodeps mysql-5.0.77-3.el5
warning: /etc/my.cnf saved as /etc/my.cnf.rpmsave
ok,系统自带的旧版本MySQL卸载完成。
摘自:http://blog.163.com/chenyao_2000/blog/static/128010930201110181464242/
实践如下:
[root@localhost htdocs]# rpm -e --allmatches --nodeps mysql-5.0.95-5.el5_9
warning: /etc/my.cnf saved as /etc/my.cnf.rpmsave
导致:Error while loading shared libraries: libcap.so.1: cannot open shared object file 。
[root@test http_pcap_codes]# rpm -qa|grep libcap
libcap-1.10-26
libcap-devel-1.10-26
libcap-1.10-26
libcap-devel-1.10-26
发现有两个一样的包,我就强制卸载rpm包遭遇error: specifies multiple packages,
rpm -e libcap-devel-1.10-26
error: "libcap-devel-1.10-26" specifies multiple packages,后强制采用了:
rpm -e libcap-1.10-26 --allmatches --nodeps 卸载后,root sudo的时候,登录提示:
Error while loading shared libraries: libcap.so.1: cannot open shared object file !
还好及时发现,后又安上了,一查原来还真有这个libcap.so.1,如下:
[root@test dbus-1.8.0]# rpm -ql libcap-1.10-26|grep libcap.so.1
/lib64/libcap.so.1
/lib64/libcap.so.1.10
/lib/libcap.so.1
/lib/libcap.so.1.10
也就是说明,这个Linux的sudo会用这个了,了解。
——————————————————
安装了CentOS6.4,发现里面有很多默认安装的软件都不需要,比如mysql,apache,php等等,用rpm -e xxxx卸载,发现不好用,man rpm看了下,有个强制卸载的选项:
–allmatches
Remove all versions of the package which match PACKAGE_NAME. Normally an error is issued if PACKAGE_NAME matches
multiple packages.
rpm -e --allmatches --nodeps mysql-5.0.77-3.el5
warning: /etc/my.cnf saved as /etc/my.cnf.rpmsave
ok,系统自带的旧版本MySQL卸载完成。
摘自:http://blog.163.com/chenyao_2000/blog/static/128010930201110181464242/
实践如下:
[root@localhost htdocs]# rpm -e --allmatches --nodeps mysql-5.0.95-5.el5_9
warning: /etc/my.cnf saved as /etc/my.cnf.rpmsave
[特别注意]Linux使用cp命令,隐藏的文件没有复制过去。mv挪动也出现挪动不过去,特别是隐藏文件,Linux cp命令如何拷贝整个目录下所有文件。
Unix/LinuxC技术 jack 2014-1-22 17:54
一、mv对Linux下的svn目录好像挪动不了,如下:
结论:
mv def 777/. 像这样直接挪动一个目录是没有问题的,隐藏的也全挪动过去,而如果用*号mv挪动,则隐藏的文件挪动不过去,所以得注意这个问题,特别是svn里svn co后,里面有好几个的隐藏文件,要注意,否则在更新时会出错。
二、cp也有这个问题:
linux下隐藏文件是.开头的,所以要复制隐藏文件直接在文件开头加个".“。也有mv的*不会拷贝隐藏文件的问题,如:
cp -Rf ../777/* ./. 这样是拷贝不过来隐藏文件滴。
这样目录直接对拷贝也就没有问题了:
cp -Rf 777 bbb
三、删除也有*删除不了隐藏的问题喔。
四、Linux cp命令如何拷贝整个目录下所有文件 :
背景:拷贝时出现把目录拷贝过去了,再就是假如linux下有隐藏文件,怎么也一起拷贝过去?
cp -r /home/test/rpmbuild/BUILD/jdk1.8.0_66/ /home/test/rpmbuild/BUILDROOT/usr/local/java
ls /home/test/rpmbuild/BUILDROOT/usr/local/java
jdk1.8.0_66
这个点很重要:
cp -r /home/test/rpmbuild/BUILD/jdk1.8.0_66/. /home/test/rpmbuild/BUILDROOT/usr/local/java
ls /home/test/rpmbuild/BUILDROOT/usr/local/java
bin javafx-src.zip man THIRDPARTYLICENSEREADME-JAVAFX.txt
COPYRIGHT jre README.html THIRDPARTYLICENSEREADME.txt
db lib release
include LICENSE src.zip
———————————————————————————————————————————————
如何在Linux下拷贝一个目录呢?这好像是再简单不过的问题了。
比如要把/home/usera拷贝到/mnt/temp,首先想到的就是
cp -R /home/usera/* /mnt/temp
但是这样有一个问题,/home/usera下的隐藏文件都不会被拷贝,子目录下的隐藏文件倒是会的。
那如何才是正确的方法呢?有人说用-a选项,有人说用find加管道。
其实没这么复杂,Google了之后,学了一招。原来只有用“.”当前目录代替“*”就好了
[函数安全] 关于strncpy函数比strcpy更安全的学习。
Unix/LinuxC技术 jack 2014-1-16 10:05
C/C++中的strncpy()函数功能为将第source串的前n个字符拷贝到destination串,原型为:
char * strncpy ( char * destination, const char * source, size_t num );
各个参数的含义显而易见,其中返回值与destination相同。
这个函数会出现三种情况:
1、num<source串的长度(包含最后的'\0'字符):那么该函数将会拷贝source的前num个字符到destination串中(不会自动为destination串加上结尾的'\0'字符);
2、num=source串的长度(包含最后的'\0'字符):那么该函数将会拷贝source的全部字符到destination串中(包括source串结尾的'\0'字符);
3、num>source串的长度(包含最后的'\0'字符):那么该函数将会拷贝source的全部字符到destination串中(包括source串结尾的'\0'字符),并且在destination串的结尾继续加上'\0'字符,直到拷贝的字符总个数等于num为止。
————————————————————————————————————
三种情况,自己做个实践:
情况一:
代码:
编译:
[root@localhost strncpy]# make strncpy
cc strncpy.c -o strncpy
运行:
[root@localhost strncpy]# ./strncpy
abc
————————————————————————————————————
情况二:
代码:
运行:
[root@localhost strncpy]# ./strncpy
abcdefghi
————————————————————————————————————
情况三:
代码:
运行:
[root@localhost strncpy]# ./strncpy
abcd
参考:http://www.cnblogs.com/unimous/archive/2012/03/05/2381151.html
char * strncpy ( char * destination, const char * source, size_t num );
各个参数的含义显而易见,其中返回值与destination相同。
这个函数会出现三种情况:
1、num<source串的长度(包含最后的'\0'字符):那么该函数将会拷贝source的前num个字符到destination串中(不会自动为destination串加上结尾的'\0'字符);
2、num=source串的长度(包含最后的'\0'字符):那么该函数将会拷贝source的全部字符到destination串中(包括source串结尾的'\0'字符);
3、num>source串的长度(包含最后的'\0'字符):那么该函数将会拷贝source的全部字符到destination串中(包括source串结尾的'\0'字符),并且在destination串的结尾继续加上'\0'字符,直到拷贝的字符总个数等于num为止。
————————————————————————————————————
三种情况,自己做个实践:
情况一:
代码:
编译:
[root@localhost strncpy]# make strncpy
cc strncpy.c -o strncpy
运行:
[root@localhost strncpy]# ./strncpy
abc
————————————————————————————————————
情况二:
代码:
运行:
[root@localhost strncpy]# ./strncpy
abcdefghi
————————————————————————————————————
情况三:
代码:
运行:
[root@localhost strncpy]# ./strncpy
abcd
参考:http://www.cnblogs.com/unimous/archive/2012/03/05/2381151.html
[实践OK]linux中fork同时创建多个子进程的方法
Unix/LinuxC技术 jack 2014-1-15 14:37
子进程和主进程得判断一下,否则会运行两次:
cat Makefile
malloc:malloc.c
gcc -g -o malloc -Wall malloc.c
gcc -g -o fork -Wall fork.c
gcc -g -o forkn -Wall forkn.c
clean:
rm -rf malloc
rm -rf fork
rm -rf forkn
查看内存:
ps -o 'pid,ppid,sz,vsz,rss,cmd' -C forkn
=============================================================================
linux中fork同时创建多个子进程的方法
正确的使用Linux中的用fork()由一个父进程创建同时多个子进程 的格式如下:
int status,i;
for (i = 0; i < 10; i++)
{
status = fork();
if (status == 0 || status == -1) break;//每次循环时,如果发现是子进程就直接从创建子进程的循环中跳出来,不让你进入循环,这样就保证了每次只有父进程来做循环创建子进程的工作
}
if (status == -1)
{
//error
}
else if (status == 0) //每个子进程都会执行的代码
{
//sub process
}
else
{
//parent process
}
来自:http://blog.sina.com.cn/s/blog_605f5b4f0100x444.html
cat Makefile
malloc:malloc.c
gcc -g -o malloc -Wall malloc.c
gcc -g -o fork -Wall fork.c
gcc -g -o forkn -Wall forkn.c
clean:
rm -rf malloc
rm -rf fork
rm -rf forkn
查看内存:
ps -o 'pid,ppid,sz,vsz,rss,cmd' -C forkn
=============================================================================
linux中fork同时创建多个子进程的方法
正确的使用Linux中的用fork()由一个父进程创建同时多个子进程 的格式如下:
int status,i;
for (i = 0; i < 10; i++)
{
status = fork();
if (status == 0 || status == -1) break;//每次循环时,如果发现是子进程就直接从创建子进程的循环中跳出来,不让你进入循环,这样就保证了每次只有父进程来做循环创建子进程的工作
}
if (status == -1)
{
//error
}
else if (status == 0) //每个子进程都会执行的代码
{
//sub process
}
else
{
//parent process
}
来自:http://blog.sina.com.cn/s/blog_605f5b4f0100x444.html
使用dmesg查看Linux IO占用较高的程序,它就是tail -f /var/log/messages。
Unix/LinuxC技术 jack 2013-12-29 20:35
tail -f /var/log/messages
环境: Ubuntu
1. 开启IO监控
sudo sysctl vm.block_dump=1
2. IO监控开启后,系统将记录程序对所有硬盘块的访问,通过dmesg查看
dmesg
[442825.284270] mysqld(11600): READ block 6676888 on xvdb2 (8 sectors)
[442825.289893] mysqld(11600): READ block 11543240 on xvdb2 (8 sectors)
[442825.291317] mysqld(11600): READ block 11543248 on xvdb2 (24 sectors)
3. 使用awk汇总,得到占用磁盘最多的进程
dmesg |awk -F " " '{print $2}'|sort|uniq -c|sort -rn|head -n 100
1564 mysqld(11600):
994 python(11474):
302 nginx(6171):
136 mysqld(29743):
126 mysqld(15528):
71 ntpd(772):
62 mysqld(16837):
4. 调试完毕后,别忘了关闭IO监控。
sudo sysctl vm.block_dump=1
摘自:http://www.luochunhui.com/linux-io-dmesg/
参考:http://blog.slogra.com/post-317.html
实践:
[root@my htdocs]# vi /proc/sys/vm/block_dump
[root@my htdocs]# sysctl vm.block_dump=1
vm.block_dump = 1
[root@my htdocs]# dmesg |awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -n 10
195 ACPI
194 pci 0000
63 alloc kstat_irqs on node 0
53 pnp 00
48 ioatdma 0000
34 igb 0000
34 EDAC sbridge
29 flush-253
26 SRAT
24 pci_bus 0000
[root@my htdocs]# sysctl vm.block_dump=0
vm.block_dump = 0
环境: Ubuntu
1. 开启IO监控
sudo sysctl vm.block_dump=1
2. IO监控开启后,系统将记录程序对所有硬盘块的访问,通过dmesg查看
dmesg
[442825.284270] mysqld(11600): READ block 6676888 on xvdb2 (8 sectors)
[442825.289893] mysqld(11600): READ block 11543240 on xvdb2 (8 sectors)
[442825.291317] mysqld(11600): READ block 11543248 on xvdb2 (24 sectors)
3. 使用awk汇总,得到占用磁盘最多的进程
dmesg |awk -F " " '{print $2}'|sort|uniq -c|sort -rn|head -n 100
1564 mysqld(11600):
994 python(11474):
302 nginx(6171):
136 mysqld(29743):
126 mysqld(15528):
71 ntpd(772):
62 mysqld(16837):
4. 调试完毕后,别忘了关闭IO监控。
sudo sysctl vm.block_dump=1
摘自:http://www.luochunhui.com/linux-io-dmesg/
参考:http://blog.slogra.com/post-317.html
实践:
[root@my htdocs]# vi /proc/sys/vm/block_dump
[root@my htdocs]# sysctl vm.block_dump=1
vm.block_dump = 1
[root@my htdocs]# dmesg |awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -n 10
195 ACPI
194 pci 0000
63 alloc kstat_irqs on node 0
53 pnp 00
48 ioatdma 0000
34 igb 0000
34 EDAC sbridge
29 flush-253
26 SRAT
24 pci_bus 0000
[root@my htdocs]# sysctl vm.block_dump=0
vm.block_dump = 0
[实践OK]expr计算器,简单好用的计算器: linux下的bc,Linux命令之bc - 浮点计算器、进制转换。
Unix/LinuxC技术 jack 2013-12-18 21:55
expr 2 \* \( 3 + 4 \)
14
在Linux中,您可以使用`expr`命令执行数学表达式的计算,但是要注意Shell中的一些特殊字符可能需要转义。对于您提供的表达式`(3+2)*2`,可以按照以下方式计算:
```bash
expr \( 3 + 2 \) \* 2
```
在这个命令中,我们使用反斜杠字符`\`来转义括号和乘号,以确保它们被正确地解释为数学运算符而不是Shell的特殊字符。这将计算 `(3 + 2) * 2`,并输出结果 `10`。
另外,还可以使用更现代的数学计算工具,如`bc`,来执行更复杂的数学运算,这通常更易于使用和阅读。例如,使用`bc`可以这样计算:
```bash
echo "(3+2)*2" | bc
```
这将输出结果 `10`。
简单好用的计算器: bc
如果我想要使用简单的计算器呢?很容易呀!就使用 bc 即可!在输入 bc 之后, 显示出版本信息之后,就进入到等待指示的阶段。如下:
[root@linux ~]# bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. _<==这个时候,光标会停留在这里等待您的输入
事实上,我们是『进入到 bc 这个指令的工作环境当中』了! 就好象我们在 Windows 里面使用calc一样!所以,我们底下尝试输入的资料, 都是在 bc 程序当中在进行运算的动作。所以,您输入的资料当然就得要符合 bc 的要求才行! 在基本的 bc 计算器操作之前,先告知几个使用的运算子好了:
+ 加法
- 减法
* 乘法
/ 除法
^ 指数
% 余数 好!让我们来使用 bc 计算一些咚咚吧!
[root@linux ~]# bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 1+2+3+4 <==只有加法时 10 7-8+3+2 4 100*52 5200 10%3 <==计算『余数』 1 10^2 100 10/100 <==这个最奇怪!不是应该是 0.1 吗? 0 quit <==离开 bc 这个计算器
在上表当中,粗体字表示输入的资料,而在每个粗体字的底下就是输出的结果。 咦!每个计算都还算正确,怎么 10/100 会变成 0 呢?这是 因为 bc 预设仅输出整数,如果要输出小数点下位数,那么就必须要执行 scale=number ,那个 number 就是小数点位数,例如:
[root@linux ~]# bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. scale=3 <==没错!就这! 1/3 .333 340/2349 .144 quit
#Linux
来自:http://hi.baidu.com/huazhixu_127/item/f962c3d7f728cd2a38f6f7d5
Linux下的bc计算器移植到windows下:http://download.csdn.net/download/u012795832/6532695
阅读全文
14
在Linux中,您可以使用`expr`命令执行数学表达式的计算,但是要注意Shell中的一些特殊字符可能需要转义。对于您提供的表达式`(3+2)*2`,可以按照以下方式计算:
```bash
expr \( 3 + 2 \) \* 2
```
在这个命令中,我们使用反斜杠字符`\`来转义括号和乘号,以确保它们被正确地解释为数学运算符而不是Shell的特殊字符。这将计算 `(3 + 2) * 2`,并输出结果 `10`。
另外,还可以使用更现代的数学计算工具,如`bc`,来执行更复杂的数学运算,这通常更易于使用和阅读。例如,使用`bc`可以这样计算:
```bash
echo "(3+2)*2" | bc
```
这将输出结果 `10`。
简单好用的计算器: bc
如果我想要使用简单的计算器呢?很容易呀!就使用 bc 即可!在输入 bc 之后, 显示出版本信息之后,就进入到等待指示的阶段。如下:
[root@linux ~]# bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. _<==这个时候,光标会停留在这里等待您的输入
事实上,我们是『进入到 bc 这个指令的工作环境当中』了! 就好象我们在 Windows 里面使用calc一样!所以,我们底下尝试输入的资料, 都是在 bc 程序当中在进行运算的动作。所以,您输入的资料当然就得要符合 bc 的要求才行! 在基本的 bc 计算器操作之前,先告知几个使用的运算子好了:
+ 加法
- 减法
* 乘法
/ 除法
^ 指数
% 余数 好!让我们来使用 bc 计算一些咚咚吧!
[root@linux ~]# bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 1+2+3+4 <==只有加法时 10 7-8+3+2 4 100*52 5200 10%3 <==计算『余数』 1 10^2 100 10/100 <==这个最奇怪!不是应该是 0.1 吗? 0 quit <==离开 bc 这个计算器
在上表当中,粗体字表示输入的资料,而在每个粗体字的底下就是输出的结果。 咦!每个计算都还算正确,怎么 10/100 会变成 0 呢?这是 因为 bc 预设仅输出整数,如果要输出小数点下位数,那么就必须要执行 scale=number ,那个 number 就是小数点位数,例如:
[root@linux ~]# bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. scale=3 <==没错!就这! 1/3 .333 340/2349 .144 quit
#Linux
来自:http://hi.baidu.com/huazhixu_127/item/f962c3d7f728cd2a38f6f7d5
Linux下的bc计算器移植到windows下:http://download.csdn.net/download/u012795832/6532695
阅读全文
[实践OK]Linux下用Top查看某些或者某个进程(top -p pid),如何得到PHP的fastCGI进程的PID及用top指定查看这些PID的方法。
Unix/LinuxC技术 jack 2013-12-14 15:05
背景:通过top下Namp的生产环境,出现某一个PHP耗CPU 100%。(先top后再:shift+P,按内存:shift+M)
————————————————————————————————————————————————————
(1)查看php-fpm进程编号:
pidof php-fpm
12560 12559 12558 12557 12556 12555 12554 12553 12552 12551 12550 12549 12548 12547 12546 12545 12544 12543 12542 12541 12540 12539 12538 12537 12536 12535 12534 12533 12532 12531 12530 12529 12528
(2)通过awk把上面的进程号形成top -p pid1 -p pid2的形式:
pidof php-fpm|awk '{gsub(/ /i," -p ");print}'
-p 2560 -p 2559 -p 2558 -p 2557 -p 2556 -p 2555 -p 2554 -p 2553 -p 2552 -p 255 -p -p 2550 -p 2549 -p 2548 -p 2547 -p 2546 -p 2545 -p 2544 -p 2543 -p 2542 -p 254 -p -p 2540 -p 2539 -p 2538 -p 2537 -p 2536 -p 2535 -p 2534 -p 2533 -p 2532 -p 253 -p -p 2530 -p 2529 -p 2528
(3)用top只看php进程号,最后top查help,是这样的( -p pid [,pid ...]):
pidof php-fpm|awk '{gsub(/ /i," -p ");print "top "$0}'
top -p 2560 -p 2559 -p 2558 -p 2557 -p 2556 -p 2555 -p 2554 -p 2553 -p 2552 -p 255 -p -p 2550 -p 2549 -p 2548 -p 2547 -p 2546 -p 2545 -p 2544 -p 2543 -p 2542 -p 254 -p -p 2540 -p 2539 -p 2538 -p 2537 -p 2536 -p 2535 -p 2534 -p 2533 -p 2532 -p 253 -p -p 2530 -p 2529 -p 2528
(4)加上管道并sh执行即可(注意pid不能大于20个PHP进程):
pidof php-fpm|awk '{gsub(/ /,",");print "top -p "$0}'
加上sh:
pidof php-fpm|awk '{gsub(/ /,",");print "top -p "$0}'|sh
试下PHP的守护进程:
pidof php|grep -v grep|awk '{gsub(/ /,",");print "top -p "$0}'|sh
top: failed tty get
所以,最后还是得贴上去才行,会报上述的错。
top -p 29886,29877,24518,1895,1885
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29886 www 15 0 120m 20m 2428 S 0 0.1 0:00.63 php
29877 root 21 0 0 0 0 Z 0 0.0 0:00.02 php <defunct>
24518 www 15 0 108m 9468 2524 S 0 0.1 0:34.99 php
1895 www 15 0 112m 13m 2424 S 0 0.1 0:02.48 php
1885 root 24 0 0 0 0 Z 0 0.0 0:00.02 php <defunct>
(5)通过对PHP的集中top后,再通过对高CPU进行监控,如12542的进程PID:
strace -p 12542
————————————————————————————————————————————————————
TOP中只查看某个或某些进程的信息
top中使用CPU或MEM排序,还是看不到我们想了解的进程的相关信息;
这时就可以指定对某个或某些进程进行TOP信息显示;
1、查看某个进程的信息
例:mysqld的信息
(1)得到mysqld进程的pid
[root@6 ~]# pidof mysqld
21538
(2)top指定查看PID
[root@6 ~]# top -p 21538
top - 09:15:06 up 30 days, 53 min, 3 users, load average: 0.07, 0.22, 0.23
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.0%us, 6.9%sy, 0.2%ni, 89.4%id, 0.3%wa, 0.1%hi, 0.1%si, 0.0%st
Mem: 1035140k total, 994888k used, 40252k free, 383072k buffers
Swap: 2048248k total, 80k used, 2048168k free, 237456k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21538 mysql 15 0 146m 21m 4372 S 0.0 2.1 3:03.84 mysqld
2、查看某些进程的信息
例:mysqld/httpd的信息
(1)得到mysqld/httpd进程的pid
[root@6 ~]# pidof mysqld
21538
[root@6 ~]# pidof httpd
31117 31116 31115 31114
(2)top指定查看PID
[root@6 ~]# top -p 21538,31117,31116,31115,31114
top - 09:20:05 up 30 days, 58 min, 3 users, load average: 0.37, 0.24, 0.23
Tasks: 5 total, 0 running, 5 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.0%us, 6.9%sy, 0.2%ni, 89.4%id, 0.3%wa, 0.1%hi, 0.1%si, 0.0%st
Mem: 1035140k total, 994364k used, 40776k free, 383404k buffers
Swap: 2048248k total, 80k used, 2048168k free, 237560k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21538 mysql 15 0 146m 21m 4372 S 0.0 2.1 3:03.86 mysqld
31117 apache 15 0 60036 8428 4668 S 0.0 0.8 0:00.48 httpd
31116 apache 15 0 60308 9.9m 6288 S 0.0 1.0 0:00.48 httpd
31115 apache 15 0 60100 8552 4756 S 0.0 0.8 0:00.48 httpd
31114 apache 15 0 59892 6452 3060 S 0.0 0.6 0:00.41 httpd
——————————————————————————————————————————
来自:http://blog.csdn.net/zhangfn2011/article/details/7488746
————————————————————————————————————————————————————
(1)查看php-fpm进程编号:
pidof php-fpm
12560 12559 12558 12557 12556 12555 12554 12553 12552 12551 12550 12549 12548 12547 12546 12545 12544 12543 12542 12541 12540 12539 12538 12537 12536 12535 12534 12533 12532 12531 12530 12529 12528
(2)通过awk把上面的进程号形成top -p pid1 -p pid2的形式:
pidof php-fpm|awk '{gsub(/ /i," -p ");print}'
-p 2560 -p 2559 -p 2558 -p 2557 -p 2556 -p 2555 -p 2554 -p 2553 -p 2552 -p 255 -p -p 2550 -p 2549 -p 2548 -p 2547 -p 2546 -p 2545 -p 2544 -p 2543 -p 2542 -p 254 -p -p 2540 -p 2539 -p 2538 -p 2537 -p 2536 -p 2535 -p 2534 -p 2533 -p 2532 -p 253 -p -p 2530 -p 2529 -p 2528
(3)用top只看php进程号,最后top查help,是这样的( -p pid [,pid ...]):
pidof php-fpm|awk '{gsub(/ /i," -p ");print "top "$0}'
top -p 2560 -p 2559 -p 2558 -p 2557 -p 2556 -p 2555 -p 2554 -p 2553 -p 2552 -p 255 -p -p 2550 -p 2549 -p 2548 -p 2547 -p 2546 -p 2545 -p 2544 -p 2543 -p 2542 -p 254 -p -p 2540 -p 2539 -p 2538 -p 2537 -p 2536 -p 2535 -p 2534 -p 2533 -p 2532 -p 253 -p -p 2530 -p 2529 -p 2528
(4)加上管道并sh执行即可(注意pid不能大于20个PHP进程):
pidof php-fpm|awk '{gsub(/ /,",");print "top -p "$0}'
加上sh:
pidof php-fpm|awk '{gsub(/ /,",");print "top -p "$0}'|sh
试下PHP的守护进程:
pidof php|grep -v grep|awk '{gsub(/ /,",");print "top -p "$0}'|sh
top: failed tty get
所以,最后还是得贴上去才行,会报上述的错。
top -p 29886,29877,24518,1895,1885
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29886 www 15 0 120m 20m 2428 S 0 0.1 0:00.63 php
29877 root 21 0 0 0 0 Z 0 0.0 0:00.02 php <defunct>
24518 www 15 0 108m 9468 2524 S 0 0.1 0:34.99 php
1895 www 15 0 112m 13m 2424 S 0 0.1 0:02.48 php
1885 root 24 0 0 0 0 Z 0 0.0 0:00.02 php <defunct>
(5)通过对PHP的集中top后,再通过对高CPU进行监控,如12542的进程PID:
strace -p 12542
————————————————————————————————————————————————————
TOP中只查看某个或某些进程的信息
top中使用CPU或MEM排序,还是看不到我们想了解的进程的相关信息;
这时就可以指定对某个或某些进程进行TOP信息显示;
1、查看某个进程的信息
例:mysqld的信息
(1)得到mysqld进程的pid
[root@6 ~]# pidof mysqld
21538
(2)top指定查看PID
[root@6 ~]# top -p 21538
top - 09:15:06 up 30 days, 53 min, 3 users, load average: 0.07, 0.22, 0.23
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.0%us, 6.9%sy, 0.2%ni, 89.4%id, 0.3%wa, 0.1%hi, 0.1%si, 0.0%st
Mem: 1035140k total, 994888k used, 40252k free, 383072k buffers
Swap: 2048248k total, 80k used, 2048168k free, 237456k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21538 mysql 15 0 146m 21m 4372 S 0.0 2.1 3:03.84 mysqld
2、查看某些进程的信息
例:mysqld/httpd的信息
(1)得到mysqld/httpd进程的pid
[root@6 ~]# pidof mysqld
21538
[root@6 ~]# pidof httpd
31117 31116 31115 31114
(2)top指定查看PID
[root@6 ~]# top -p 21538,31117,31116,31115,31114
top - 09:20:05 up 30 days, 58 min, 3 users, load average: 0.37, 0.24, 0.23
Tasks: 5 total, 0 running, 5 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.0%us, 6.9%sy, 0.2%ni, 89.4%id, 0.3%wa, 0.1%hi, 0.1%si, 0.0%st
Mem: 1035140k total, 994364k used, 40776k free, 383404k buffers
Swap: 2048248k total, 80k used, 2048168k free, 237560k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21538 mysql 15 0 146m 21m 4372 S 0.0 2.1 3:03.86 mysqld
31117 apache 15 0 60036 8428 4668 S 0.0 0.8 0:00.48 httpd
31116 apache 15 0 60308 9.9m 6288 S 0.0 1.0 0:00.48 httpd
31115 apache 15 0 60100 8552 4756 S 0.0 0.8 0:00.48 httpd
31114 apache 15 0 59892 6452 3060 S 0.0 0.6 0:00.41 httpd
——————————————————————————————————————————
来自:http://blog.csdn.net/zhangfn2011/article/details/7488746
[实践Ok]secureCRT同时操作多个不同终端(多个会话窗口),secureCRT-多个终端上同时执行同个命令。及secureCRT使用按钮栏进行密码发送常用操作。
Unix/LinuxC技术 jack 2013-12-12 12:40
背景:在小公司里没有多少台机器,运维或开发想执行命令则用到,大批量机器上千、万台则需要有zoomkeeper和shell配合,以web形式提供出管理工具,如codebuilder、pms、ccs等。
一:Securecrt同时操作多个会话窗口:
1,选中:查看/交互窗口
2,开启多个会话窗口
3,右击任何一个会话窗口下面的交互窗口,选中:发送交互到所有标签
4,在交互窗口输入命令,就会同时在多个会话窗口执行了!
来自:http://blog.itpub.net/9240380/viewspace-668253
参看:http://blog.sina.com.cn/s/blog_8e5b826701011msc.html
实践如下,我的是英文版本,如下:
在SecureCRT下的view下选中Chat wWndows后,下面出现一个小窗框,然后在小窗口上面点右键盘选中:Send Chat to All Tabs.即可。
背景:有时线上的mysql比较怪异,所以,有这个标签进行分组并一点就Ok的玩意会相对方便不容易出错些:
二:SecureCRT使用按钮栏进行密码发送常用操作:
1)使用按钮栏:选择查看-》按钮栏会显示按钮栏,勾选按钮栏,勾选之后最下面多出了一个按钮栏,在上面可以新建的按钮。
2)新建按钮如:鼠标移动到按钮栏上,单击右键,会有new button ,new button bar,delete button bar选项。第一个是在按钮栏添加按钮,new button bar是增加新的按钮栏,最后是删除按钮栏。
3)按钮栏的作用:就是单击它可以和secureCRT窗口进行交互,比如我要连接某个机器,但是机器名很长不想记录怎么办?那就通过新建一个按钮来解决啊。如下图所示。注意send String是按钮发送的命令,如果不加“\n”,那么不会执行,需要在窗口中显示的输入回车才能执行,label中是新建的button名称,一般命名为机器名或者操作名称。有了这个功能就可以把多个机器的地址分别建一个button,这样只需要输入一次,就可以不用记忆繁琐的机器名而进行机器的远程连接了。
3)按钮栏的下拉框分组:(1)默认(default)(2)线上地址(3)数据库三个按钮栏了。如果不需要这么多怎么办?删除就可以了。同样的,增加的button也可以修改、删除。
来自,参考有图:http://jingyan.baidu.com/album/d3b74d64a752671f77e6092a.html
一:Securecrt同时操作多个会话窗口:
1,选中:查看/交互窗口
2,开启多个会话窗口
3,右击任何一个会话窗口下面的交互窗口,选中:发送交互到所有标签
4,在交互窗口输入命令,就会同时在多个会话窗口执行了!
来自:http://blog.itpub.net/9240380/viewspace-668253
参看:http://blog.sina.com.cn/s/blog_8e5b826701011msc.html
实践如下,我的是英文版本,如下:
在SecureCRT下的view下选中Chat wWndows后,下面出现一个小窗框,然后在小窗口上面点右键盘选中:Send Chat to All Tabs.即可。
背景:有时线上的mysql比较怪异,所以,有这个标签进行分组并一点就Ok的玩意会相对方便不容易出错些:
二:SecureCRT使用按钮栏进行密码发送常用操作:
1)使用按钮栏:选择查看-》按钮栏会显示按钮栏,勾选按钮栏,勾选之后最下面多出了一个按钮栏,在上面可以新建的按钮。
2)新建按钮如:鼠标移动到按钮栏上,单击右键,会有new button ,new button bar,delete button bar选项。第一个是在按钮栏添加按钮,new button bar是增加新的按钮栏,最后是删除按钮栏。
3)按钮栏的作用:就是单击它可以和secureCRT窗口进行交互,比如我要连接某个机器,但是机器名很长不想记录怎么办?那就通过新建一个按钮来解决啊。如下图所示。注意send String是按钮发送的命令,如果不加“\n”,那么不会执行,需要在窗口中显示的输入回车才能执行,label中是新建的button名称,一般命名为机器名或者操作名称。有了这个功能就可以把多个机器的地址分别建一个button,这样只需要输入一次,就可以不用记忆繁琐的机器名而进行机器的远程连接了。
3)按钮栏的下拉框分组:(1)默认(default)(2)线上地址(3)数据库三个按钮栏了。如果不需要这么多怎么办?删除就可以了。同样的,增加的button也可以修改、删除。
来自,参考有图:http://jingyan.baidu.com/album/d3b74d64a752671f77e6092a.html
crontab 指定执行用户
Unix/LinuxC技术 jack 2013-12-5 10:46
1)查看当前用户下的cron任务:crontab -l
2)编辑当前用户的定时任务:crontab -e
3)编辑root用户linuxso的定时任务: crontab -u root -e
阅读全文
2)编辑当前用户的定时任务:crontab -e
3)编辑root用户linuxso的定时任务: crontab -u root -e
阅读全文
linux 如何查看用户id
Unix/LinuxC技术 jack 2013-12-4 23:17
背景:查一个日志,出现48的用户值:
-rwxrwxrwx 1 48 48 1421133 Dec 5 15:14 checkdaemon_album_20131205.php
-rwxrwxrwx 1 root root 1431216 Dec 5 15:14 checkdaemon_report_20131205.php
-rwxrwxrwx 1 www www 3752063 Dec 5 15:14 core-20131205.php
————————————————————————————————————————————
用户的ID就是USER ID喽,也就是常说的UID.有一个文件专门存放UID信息的,在/etc/passwd里。root用户的ID是0.
从1~499的大多是系统服务或软件厂商自定议的ID。而普通的用户的UID是从500开始往后依次加1.
实践示例:
你也可以用 cat /etc/passwd | grep <你的用户名> 来查看你的ID。
我是:504,而su成root后,
查看当前root用户,也可直接输入:id
当然,也可以通过:
也可看到root是0,我还是504:
root:x:0:
xiangdong:x:504:
这儿也可以查看,特殊在它能查到一些非登录的用户Id:
www:x:48:48::/home/www:/sbin/nologin
最后,用finger吧:
[root@localhost 20131205]# finger 48
-bash: finger: command not found
yum install finger
finger www
[root@localhost 20131205]# finger www
Login: www Name:
Directory: /home/www Shell: /bin/bash
Never logged in.
No mail.
No Plan.
来自:http://zhidao.baidu.com/link?url=z6Ca_wyf6UwLZGun4pb8o8Lj3VxyUwhzQ4XzVZGOSARChu935hy_YOlSJPagp7eRi2KbVuE1Z17t6TcQCNwaAa
-rwxrwxrwx 1 48 48 1421133 Dec 5 15:14 checkdaemon_album_20131205.php
-rwxrwxrwx 1 root root 1431216 Dec 5 15:14 checkdaemon_report_20131205.php
-rwxrwxrwx 1 www www 3752063 Dec 5 15:14 core-20131205.php
————————————————————————————————————————————
用户的ID就是USER ID喽,也就是常说的UID.有一个文件专门存放UID信息的,在/etc/passwd里。root用户的ID是0.
从1~499的大多是系统服务或软件厂商自定议的ID。而普通的用户的UID是从500开始往后依次加1.
实践示例:
你也可以用 cat /etc/passwd | grep <你的用户名> 来查看你的ID。
我是:504,而su成root后,
查看当前root用户,也可直接输入:id
当然,也可以通过:
也可看到root是0,我还是504:
root:x:0:
xiangdong:x:504:
这儿也可以查看,特殊在它能查到一些非登录的用户Id:
www:x:48:48::/home/www:/sbin/nologin
最后,用finger吧:
[root@localhost 20131205]# finger 48
-bash: finger: command not found
yum install finger
finger www
[root@localhost 20131205]# finger www
Login: www Name:
Directory: /home/www Shell: /bin/bash
Never logged in.
No mail.
No Plan.
来自:http://zhidao.baidu.com/link?url=z6Ca_wyf6UwLZGun4pb8o8Lj3VxyUwhzQ4XzVZGOSARChu935hy_YOlSJPagp7eRi2KbVuE1Z17t6TcQCNwaAa
curl中为什么-d选项不能和-I连用
Unix/LinuxC技术 jack 2013-12-2 16:52
背景:我在写http://jackxiang.com/post/4070/ 时发现的(Post并cookie,想看http头不行),一看还真有这个问题,主要是http头部Cookie值是否真送出去了以及Post数据是否也按指定方式给Post出去,查看加密前的待发送的数据的包头信息,以查看待发送头部的cookie信息等都有用的。于是做下记录。
-d是用post提交表单,-I是只读取http head,提示错误Warning: You can only select one HTTP request!
来自:http://bbs.csdn.net/topics/320186919
实践:的确Warning: You can only select one HTTP request!
国外:http://stackoverflow.com/questions/286982/curl-post-data-and-headers-only
Curl post data and headers only
I want to get the headers only from a curl request
curl -I www.google.com
All grand. Now I want to do that but to pass in post data too:
curl -I -d'test=test' www.google.com
But all I get is:
Warning: You can only select one HTTP request!
Anyone have any idea how to do this or am I doing something stupid?
2 Answers
The -I option tells curl to do a HEAD request while the -d'test=test' option tells curl to do a POST, so you're telling curl to do two different request types.
curl -s -d'test=test' -D- -o/dev/null www.google.com
or, on Windows:
curl -s -d'test=test' -D- -onul: www.google.com
That is the neatest way to do this as far as I can find. The options are:
-D- Dump the header to the file listed, or stdout when - is passed, like this.
-o/dev/null Send the body to the file listed. Here, we discard the body so we only see the headers.
-s Silent (no progress bar)
-d means you are sending form data, via the POST method. -I means you are just peeking at the metadata via HEAD.
I'd suggest either
Download to /dev/null and write the headers via the -D headerfile to the file headerfile
Use -i to include the headers in the answers and skip everything from the first empty line.
Old, I know, but I would suggest adding -s to clean up the output a little bit.
最后使用方法:
1)于是,返回服务端的头很容易看到,如下:
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 02 Dec 2013 09:57:59 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
2)最后,想看发出的请求头?
背景里说的:http头部Cookie值是否真送出去了以及Post数据是否也按指定方式给Post出去
请求的头用 curl 是看不到的
—————解决方案—————
抓包软件
(1)Windows下:firefox用firebug/httpfox/fiddler2/httplook/HttpAnalyzerStdV7
网卡用SmartSniff
(2)Linux下:用tcpdump抓包后,sz到windows上用wireshark查看http包发送的请求头:
File->ExportObjects->HTTP->找到发送的请求链接(因为还有一个回包的请求,所以要区分开),选中后,在主界面会自动定位到,展开:
Hypertext Transfer protocol ,就能看到如下我前面发的cookie:
而Post数据就在:HTML Form URL Encoded: application/x-www-form-urlencoded 下展开里面:
-d是用post提交表单,-I是只读取http head,提示错误Warning: You can only select one HTTP request!
来自:http://bbs.csdn.net/topics/320186919
实践:的确Warning: You can only select one HTTP request!
国外:http://stackoverflow.com/questions/286982/curl-post-data-and-headers-only
Curl post data and headers only
I want to get the headers only from a curl request
curl -I www.google.com
All grand. Now I want to do that but to pass in post data too:
curl -I -d'test=test' www.google.com
But all I get is:
Warning: You can only select one HTTP request!
Anyone have any idea how to do this or am I doing something stupid?
2 Answers
The -I option tells curl to do a HEAD request while the -d'test=test' option tells curl to do a POST, so you're telling curl to do two different request types.
curl -s -d'test=test' -D- -o/dev/null www.google.com
or, on Windows:
curl -s -d'test=test' -D- -onul: www.google.com
That is the neatest way to do this as far as I can find. The options are:
-D- Dump the header to the file listed, or stdout when - is passed, like this.
-o/dev/null Send the body to the file listed. Here, we discard the body so we only see the headers.
-s Silent (no progress bar)
-d means you are sending form data, via the POST method. -I means you are just peeking at the metadata via HEAD.
I'd suggest either
Download to /dev/null and write the headers via the -D headerfile to the file headerfile
Use -i to include the headers in the answers and skip everything from the first empty line.
Old, I know, but I would suggest adding -s to clean up the output a little bit.
最后使用方法:
1)于是,返回服务端的头很容易看到,如下:
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 02 Dec 2013 09:57:59 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
2)最后,想看发出的请求头?
背景里说的:http头部Cookie值是否真送出去了以及Post数据是否也按指定方式给Post出去
请求的头用 curl 是看不到的
—————解决方案—————
抓包软件
(1)Windows下:firefox用firebug/httpfox/fiddler2/httplook/HttpAnalyzerStdV7
网卡用SmartSniff
(2)Linux下:用tcpdump抓包后,sz到windows上用wireshark查看http包发送的请求头:
File->ExportObjects->HTTP->找到发送的请求链接(因为还有一个回包的请求,所以要区分开),选中后,在主界面会自动定位到,展开:
Hypertext Transfer protocol ,就能看到如下我前面发的cookie:
而Post数据就在:HTML Form URL Encoded: application/x-www-form-urlencoded 下展开里面:
为什么我离不开Linux?
Unix/LinuxC技术 jack 2013-11-25 22:22
【转】Linux下c语言写的定时器(计时器)
Unix/LinuxC技术 jack 2013-11-25 13:45
【转】Linux下c语言写的定时器(计时器)
【实现功能】:下的C编程:编写一个程序(库),实现定时器(计时器)的功能,它能为用户提供在同一进程中多次使用的定时器。这里要求用信号来实现。
【解题思路】:编写一个结构体Timer代表一个计时器,然后再定义Timer类型的数组myTimer[N],用来保存我们设置的定时器;再定义函数setTimer()生成计时器,并将生成的计时器保存到myTimer中,这样通过多次调用,就可以在同一个进程中生成多个计时器;定义timeout()信号处理函数,每隔一秒产生一个信号,通过调用timeout()对所有的定时器扫描一遍,检查哪些计时器超时。
【程序代码】:如下
阅读全文
【实现功能】:下的C编程:编写一个程序(库),实现定时器(计时器)的功能,它能为用户提供在同一进程中多次使用的定时器。这里要求用信号来实现。
【解题思路】:编写一个结构体Timer代表一个计时器,然后再定义Timer类型的数组myTimer[N],用来保存我们设置的定时器;再定义函数setTimer()生成计时器,并将生成的计时器保存到myTimer中,这样通过多次调用,就可以在同一个进程中生成多个计时器;定义timeout()信号处理函数,每隔一秒产生一个信号,通过调用timeout()对所有的定时器扫描一遍,检查哪些计时器超时。
【程序代码】:如下
阅读全文




