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
国内机房经常因为没有备案而过滤网站,并且这种过滤是不定时的!太让人蛋疼!

瑞豪开源给客户提供如下方法临时解决这个蛋疼的问题,等备案下来之后就可以恢复正常。

客户在服务器上设置一下端口转发,把服务器的8989端口重定向到80端口去。Linux上可以通过如下命令:

iptables -t nat -I PREROUTING -p tcp --dport 8989 -j REDIRECT --to-port 80 来实现。

然后客户把自己的域名指向修改到我们提供的转发IP地址:103.28.45.240

最后,我们在103.28.45.240上面加一下客户的域名,就可以为客户转发了,客户的域名也就可以正常打开了。

来自:http://rashost.com/blog/nobeian-redirect
环境: 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
简单好用的计算器: 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
阅读全文
背景:通过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
背景:在小公司里没有多少台机器,运维或开发想执行命令则用到,大批量机器上千、万台则需要有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
背景:有时多台机器时通过nsf进行用户统一写入在看日志时需要看到相同用户,而多台的用户一样是www,但是其id不一样,导致不同服务器看上去不一致,为此需要修改一样。
添加用户名时指定id、修改用户id、修改组的id、修改用户名、修改组名:

FreeBSD:

#rmuser username(需要删除的用户名)
#passwd username(要修改密码的用户名)
======================================================
因为先前有一个账户是xiangdong,我后再删除再添加一次(没有-d参数指定目录)出现:
bash-3.2$ ssh -lxiangdong localhost
Could not create directory '/home/xiangdong/.ssh'.
Could not chdir to home directory /home/xiangdong: Permission denied

chown -R xiangdong /home/xiangdong/
再次登录Ok。

没加d也可以后面再加上:
linux命令 用什么命令设置用户home目录:
id jack
uid=508(jack) gid=0(root) groups=0(root)
usermod -u508 -d /home/xiangdong -m /home/jack
其它操作:http://urchin.blog.51cto.com/4356076/987186

当然也可手动操作,用直接修改Linux下的两个文件进行修改即可,
如linux下的www用户的uid是701,www的组也是711,现在要修改为527和498,得修改两个文件:
1:打开文件 /etc/passwd配置文件
修改/etc/passwd文件进行对www用户的uid和gid进行修改修改对应的527和498:
vi /etc/passwd
www:x:701:701::/home/www:/sbin/nologin

2.打开文件 /etc/group文件:
vi /etc/group
www:x:701:    
把701修改为498。

3:如果有家目录则把JACK这个帐户对应的默认目录  /home/JACK改为/home/JACK/code即可,然后保存。

如果有多台,如何批量一次性修改及查看修改是否成功呢?用如下ansible命令即可,很是方便:
qrtool.jackxiang.com.yml

运行完上面这个脚本后,再检查是否有30台(qr_web有30台),
ansible qr_web -m shell -a"id www"|grep"uid=527(www) gid=498(www)"|wc  有30台就对了。
如果不放心重新批里启动一下nginx和php-fpm如下:
ansible qr_web -m shell -a"service nginx restart && service php-fpm restart"        
对之前的www的uid的701作修改目录及代码的chown权限为新的uid:
ansible qr_web -m shell -a"chown -R www:www /data/www"  
阅读全文
1)查看当前用户下的cron任务:crontab   -l  
2)编辑当前用户的定时任务:crontab -e
3)编辑root用户linuxso的定时任务: crontab -u  root  -e

阅读全文
背景:查一个日志,出现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
背景:我在写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 下展开里面:
  
【转】Linux下c语言写的定时器(计时器)
【实现功能】:下的C编程:编写一个程序(库),实现定时器(计时器)的功能,它能为用户提供在同一进程中多次使用的定时器。这里要求用信号来实现。
【解题思路】:编写一个结构体Timer代表一个计时器,然后再定义Timer类型的数组myTimer[N],用来保存我们设置的定时器;再定义函数setTimer()生成计时器,并将生成的计时器保存到myTimer中,这样通过多次调用,就可以在同一个进程中生成多个计时器;定义timeout()信号处理函数,每隔一秒产生一个信号,通过调用timeout()对所有的定时器扫描一遍,检查哪些计时器超时。
【程序代码】:如下阅读全文
linux umount 时出现device is busy 的处理方法--fuser,20253进程在使用,退出或杀死:
    * 查询: fuser -m /media/share  #/media/share 是挂载在本地的目录
    * 显示: /media/share: 25023c  #25023c   是进程编号,25023是进程PID。用ps aux|grep 25023进行查看是哪个进程导致出现device is busy
—————————————————————某个文件是谁在读取,反查进程有用———————————————————————————————


[root@iZ25dcp92ckZ multepoolserver]# ps aux|grep hhvm
www      15801  0.0 14.0 826616 142904 ?       Sl   14:15   0:00 /usr/bin/hhvm --mode server --user www --config /etc/hhvm/server.ini --config /etc/hhvm/php.ini --config /etc/hhvm/config.hdf
www      15804  0.0  0.1 115212  1404 ?        S    14:15   0:00 bash -c ! fuser /data/runsock/hhvm.sock
www      15805  0.0  0.0 107904   828 ?        R    14:15   0:00 fuser /data/runsock/hhvm.sock
root     15807  0.0  0.0 110224   904 pts/0    S+   14:15   0:00 grep --color=auto hhvm
[root@iZ25dcp92ckZ multepoolserver]# fuser /data/runsock/hhvm.sock
/data/runsock/hhvm.sock: 15801
——————————————————————————————————————————————————————————————

我的日志文件太大了,一直在写,但关了还有程序在写,能反查到是谁在写么?
du -sh Remote-20131216.log  
4.3G    Remote-20131216.log
lsof abc.txt 显示开启文件abc.txt的进程:
lsof  Remote-20131216.log  .
安装lsof包(yum install lsof),安装完成可以使用lsof命令。
没有:
回忆未来-向东-Jàck  下午 03:41:05
我就是要这个啊哈哈。
没有囁。
大侠江  下午 03:42:36
COMMAND 有没有进程记录
如过没有就没有了
回忆未来-向东-Jàck  下午 03:44:20
我这边是加载的NFS,Linux都挂载到日志上了。
可能是这个原因吧?NFS网络挂载的。
linux中TOP命令显示出COMMAND进程名?
top 后有一个
http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html
大侠江  下午 03:48:40
lsof 显示的的COMMAND
回忆未来-向东-Jàck  下午 03:49:51
好几列啊,就lsof  lsof |grep xxxx.avi 虽然有点慢,但是可以用。
lsof -f 不行的,先用grep试试吧。那就去掉-f,直接+文件试一试?
不行的。还是 grep 吧  lsof 加上-n貌似会快一点。
确实快了很多,瞬间返回。


这个lsof是啥原理,是扫整个系统的打开文件句柄了?
遍历 /proc/实现的。

fuser
fuser -v file
使用-v选项将显示更全的信息:
# fuser -v /root
            USER     PID    ACCESS   COMMAND
/root:      root    17923    ..c..      bash
            root    24869    ..c..      atop


root@119.10.*.23:~# fuser -v -n tcp 80
                     用户     进程号 权限   命令
80/tcp:              root       7717 F.... nginx
                     www        7718 F.... nginx
                     www        7719 F.... nginx

来自:http://www.cnblogs.com/bangerlee/articles/2460614.html
         http://www.cnblogs.com/yuboyue/archive/2011/07/18/2109838.html
方法:

lsof-4.82-4.el6.x86_64
[root@localhost htdocs]# rpm -qa|grep lsof
lsof-4.82-4.el6.x86_64

/usr/sbin/lsof|grep "Remote-20131216.log"
阅读全文
背景:有时用wireshark抓到的post数据时,需要把一列并成一行形成CUrl格式的数据进行模拟Post请求,用awk快速实现一列变一行。
一、一列变成一行的AWK实现方法:
请教!怎么把一个文本的一列,换成一行?
在vi中能做吗?
sed可以做到
是吗?请教sed怎么实现呢?谢谢!
也就是一个文件是这样的:
oplasttr
dsprjord
accontsup106
alprjinfo
holiday
把它替换成oplasttr dsprjord accontsup106 alprjinfo holiday
cat test.txt | awk '{printf "%s ",$0}'
AWK可以取出任何一列并形成行:
例子:  
[root@WANGJIAN ~]# cat file  
a 13  
b 1  
c 23  
d 234  
[root@WANGJIAN ~]# awk '{printf "%s", $1}' file  
abcd  

把a、b、c、d与相应的值放到file里,然后通过awk语句实现列变行的转换。

实践如下:
[root@test tmp]# vi test
You have new mail in /var/spool/mail/root
[root@test tmp]# cat test | awk '{printf "%s ",$0}'    
oplasttr dsprjord accontsup106 alprjinfo holiday

[root@test tmp]# cat test | awk '{printf "%s ",$1}'
oplasttr dsprjord accontsup106 alprjinfo holiday

而用wireshark导出的Post或Get参数时是以如下形式进行分布的:
Content-Disposition: form-data; name="playlist"
20362
------------GI3GI3gL6GI3ae0gL6Ef1ei4gL6gL6
Content-Disposition: form-data; name="user_name"
20120926173632167912
------------GI3GI3gL6GI3ae0gL6Ef1ei4gL6gL6
Content-Disposition: form-data; name="email"
21240168
------------GI3GI3gL6GI3ae0gL6Ef1ei4gL6gL6
用editplus处理下就形成下面的格式了:
1)Content-Disposition: form-data; name=" 全部替换掉。
2)"$ 用正则把后面的"给去掉。
3)------------GI3GI3gL6GI3ae0gL6Ef1ei4gL6gL6 替换掉。
4)用^[\t ]*\n  正则把空行去掉。
形成下面的结构,再用awk处理一下就形成了post的格式(数据多时这样做最省力,少了就自己拼吧):
playlist
20362
user_name
20120926173632167912
email
21240168
如下处理:

自己的实践下要多行,问了下scottjiang兄弟一行搞定:

来自:http://linux.sheup.com/linux/linux5480.htm

二、sed和awk实现打印奇数行和偶数行
假设文件为test.txt
1.奇数行:
    awk实现:awk '{if (NR%2==1) print $0}'  test.txt
    sed实现:sed -n 'p;n' test.txt
2.偶数行:
    awk实现:awk '{if (NR%2==0) print $0}'  test.txt
    sed实现:sed -n 'n;p' test.txt
来自:http://blog.chinaunix.net/uid-7845870-id-3203124.html


三、awk 多列变多行的转换:
tony@tony-LIFEBOOK-LH532:~$ cat test
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

怎么变成
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
4 4 4 4 4 4
5 5 5 5 5 5
——————————————————————
AWK:

实践如下:
[root@test tmp]# vi test
[root@test tmp]# cat test|awk '{for(i=1;i<=NF;i++)a[i]=a[i]?a[i]" "$i:$i}END{for(i=1;i<=NF;i++)print a[i]}'
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
4 4 4 4 4 4
5 5 5 5 5 5
来自:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4078467
实践发现,这块如果是xterm会显示,好像linux不显示这个标签,这块应该可以设置:http://jackxiang.com/post/3474/里,让标签显示文件路径,有描述:
让标签显示文件路径:
Options => Session Options => Terminal => Emulation
选择Terminal为Xterm/VShell,勾选“ANSI Color”,这样就会自动修改标签标题,还会包含当前目录。

==========================================================
实践OK如下:
vim /etc/sysconfig/bash-prompt-xterm
echo -ne "\e]2;仿真机\a"
再登录出现如下提示:
-bash: /etc/sysconfig/bash-prompt-xterm: Permission denied
加上权限:
chmod -R 777  /etc/sysconfig/bash-prompt-xterm
进示更加丰富:
echo -ne "\e]2;仿真机@$(ifconfig eth0|grep "inet addr"|cut -f2 -d:|awk '{print $1}')\a"

/etc/sysconfig/bash-prompt-xterm: line 1: ifconfig: command not found
echo -ne "\e]2;仿真机@$(/sbin/ifconfig eth0|grep "inet addr"|cut -f2 -d:|awk '{print $1}')\a"

CentOS7,因ifconfig的返回ip格式有变得这样:


———————————————————————————————————————————————————————————————
有时会不小心在ctrl+B时误按成Ctrl+V后发现按错了,一瞬间又按了b(或ctrl+b),于是,把原来的会话标签页给去勾选了,标签没了,就当前了。
,查看并勾选会话标签页选项。
http://linuxroad.blog.51cto.com/765922/1022602
在linux系统中设置的方法(此法适用于所有远程登录的软件)

这时候只需要简单两步即可搞定
[root@centos581 sysconfig]# vim /etc/sysconfig/bash-prompt-xterm
echo -ne "\e]2;$(ifconfig eth0|grep "inet addr"|cut -f2 -d:|awk '{print $1}')\a"

[root@centos581 sysconfig]# chmod 755 /etc/sysconfig/bash-prompt-xterm

当然,你也可以定义让其显示你指定的字符串。
比如:
[root@centos581 sysconfig]# vim /etc/sysconfig/bash-prompt-xterm
echo -ne "\e]2;hello\a"



CentOS7修改好像无效,于是查了一下:
一个是可能修改了hostname:http://jackxiang.com/post/5640/
二是linux下的shell——如何修改shell的提示符,能够出现登录用户名、主机名和路径
  有的机器上可能登上去后显示总是-bash-3.00$,解决方法是对比其他机器的~/.bash_profile文件,发现补充上以下东西就可以显示"xx@机器名 当前dir“了。

2 if [ -f ~/.bashrc ]; then
  3     . ~/.bashrc
  4 fi
  5 PATH=$PATH:$HOME/bin
  6 export PATH
  7 unset USERNAME



深入的看下,发现是在/etc/bashrc文件里面有/etc/sysconfig/bash-prompt-xterm这样的设置,/etc/bashrc:

17 # are we an interactive shell?
18 if [ "$PS1" ]; then
19     case $TERM in
20     xterm*)
21         if [ -e /etc/sysconfig/bash-prompt-xterm ]; then
22             PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm
23         else
24             PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"'
25         fi
26         ;;

发现是这个变量在阿里云里有值,而没有加载导致的,如下,非阿里去是没有这个PROMPT_COMMAND参数的: -AddTime:2015-10-12
PROMPT_COMMAND=""; //加一行清空这个变量也就对了,PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm能运行进去了,呵呵:
if [ -z "$PROMPT_COMMAND" ]; then 这一行阿里云给加上了,其它常规linux没有的,像centOS啥的:
-z STRING
              the length of STRING is zero
PROMPT_COMMAND估计是干这事的:Linux利用PROMPT_COMMAND实现操作记录的功能,http://www.bdqn.cn/news/201312/12316.shtml
Linux 利用 PROMPT_COMMAND 实现审计功能  :http://blog.163.com/ly_89/blog/static/1869022992011756434459/
看了下:/var/log/sa:
sa01  sa03  sa05  sa07  sa09  ... sa30 (一个月的日志)
————————————————————————
if [ "$PS1" ]; then
  if [ -z "$PROMPT_COMMAND" ]; then
    case $TERM in
    xterm*|vte*)
      if [ -e /etc/sysconfig/bash-prompt-xterm ]; then
          PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm
      elif [ "${VTE_VERSION:-0}" -ge 3405 ]; then
          PROMPT_COMMAND="__vte_prompt_command"
      else
          PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
      fi
      ;;
来自:http://www.cnblogs.com/mangu-uu/archive/2012/10/08/2715503.html

cat /etc/sysconfig/bash-prompt-xterm
echo -ne "\e]3;阿里云bobWB's VPS@$(/sbin/ifconfig eth1|grep "inet"|awk  -F" " '{print $2}')\a"
下次登录后就secureCRT标签里就会出现:
阿里云bobWB's VPS@101.200.1.***
————————————————————————————————————————————————————————————————
方法:
步骤一:
使用xterm让标签显示文件路径:
Options => Session Options => Terminal => Emulation
选择Terminal为Xterm/VShell,勾选“ANSI Color”,这样就会自动修改标签标题,还会包含当前目录,
这样就会自动修改标签标题,还会包含当前目录,类似这样:
user@host:/home/user/

步骤二:把IP地址由localhost修改为真实IP,多机器时好维护
将服务器名称设为你清楚的名字或者是ip地址,
这样连上服务器了,标签只是显示名称了,而不是登入后的帐号名和登入服务器的主机名:
________________________________________________________________
永久性修改服务器名称:
编辑/etc/sysconfig/network
修改HOSTNAME=新名称
保存后退出
同时修改/etc/hosts
添加一行 127.0.0.1    新名称
保存后退出
好了,如果是服务器建议还是重启一次,更新主机名,如果是普通用户电脑,那么就继续玩吧,这次就暂时用hostname修改,下次重启就正常了。

步骤三:对投影仪、Linux下的目录因颜色导致看不清的解决办法:
在使用投影仪的时候,可以勾选“Use color scheme”,即可以实现白底黑字效果,这样比黑底白字看的清楚些。
设置成xterm后,会发现在黑色背景下,目录的颜色太深,看不太清楚:
目录看不清的解决方案:Global Options => Terminal => Appearance => ANSI Color:将Normal color的颜色改成自己喜欢的颜色即可。(勾选“ANSI Color”, 才能显示鲜艳的颜色)
改变显示的最大列(默认80列,不满屏):
1) Global Options => Terminal => Appearance, 调整最大列为300;(实践Ok:选项->全局选项->外观->最大列:300)
2) Options => Session Options => Terminal => Emulation,调整逻辑列为132(或其他)(实践Ok:选项->会话选项->终端->仿真->逻辑列:132)

参考:
http://blog.opvps.com/securecrt-%E6%98%BE%E7%A4%BA%E6%A0%87%E7%AD%BE%E8%AE%BE%E5%AE%9A/
http://z515123.blog.51cto.com/679304/647679
Dig 在CentOS6.4下面的安装方法及查找某命令在哪个包的方法:http://jackxiang.com/post/7038/
一)
安装DNS服务器的时候,想测试一下DNS服务器,发现没有host dig nslookup命令,原来是没有安装bind-untils,立即yum install bind-untils搞定如下:
yum install bind-utils
它们各自的位置在:
[root@localhost site]# ls /usr/bin/nslookup
/usr/bin/nslookup
You have new mail in /var/spool/mail/root
[root@localhost site]# ls /usr/bin/dig
/usr/bin/dig
[root@localhost site]# ls /usr/bin/host
/usr/bin/host
实践如下:
Total download size: 1.0 M
Installed size: 2.6 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): bind-libs-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm                                                                                    | 878 kB     00:00    
(2/2): bind-utils-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm                                                                                   | 182 kB     00:00    
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                        9.0 MB/s | 1.0 MB     00:00    
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : 32:bind-libs-9.8.2-0.17.rc1.el6_4.6.x86_64   1/2
  Installing : 32:bind-utils-9.8.2-0.17.rc1.el6_4.6.x86_64   2/2
  Verifying  : 32:bind-libs-9.8.2-0.17.rc1.el6_4.6.x86_64   1/2
  Verifying  : 32:bind-utils-9.8.2-0.17.rc1.el6_4.6.x86_64   2/2
Installed:
  bind-utils.x86_64 32:9.8.2-0.17.rc1.el6_4.6                                                                                                                
Dependency Installed:
  bind-libs.x86_64 32:9.8.2-0.17.rc1.el6_4.6                                                                                                                
Complete!

二)我的LINUX服务器没有strace命令,CENTOS 6.4,怎么安装它呢
打开终端,输入命令:rpm -qa |grep strace,如果显示为空。
3. 如果没有这个显示结果,可以采取如下方式:
3.1 在系统光盘中查找对应的软件包,一般在Server目录下;
3.2 可以去Linux系统对应的官方网站进行下载对应的软件包;
4. 安装方式:
4.1 如果在图形界面,通常双击安装即可;
4.2 如果是在命令行界面,进入对应的路径,输入命令“rpm -ivh strace等文件全称.rpm”安装即可;
4.3 安装完成后使用命令“rpm -qa |grep strace”查询即可知道是否安装正确。

注:如果已经安装了yum源即可直接输入命令:root#yum -install strace-4.5.18-5.el5
使用:
复杂的用法还是直接man strace看说明吧,这里说个最简单的用法就是 strace -p <PID>针对进程跟踪。

Egg:
Total download size: 172 k
Installed size: 533 k
Is this ok [y/N]: y
Downloading Packages:
strace-4.5.19-1.17.el6.x86_64.rpm | 172 kB     00:00    
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : strace-4.5.19-1.17.el6.x86_64   1/1
  Verifying  : strace-4.5.19-1.17.el6.x86_64   1/1

Installed:
  strace.x86_64 0:4.5.19-1.17.el6
背景: 在树莓派上编译安装Nginx出现下面错误,因为是相当于debian上安装,所以得atp-get。
阅读全文
预告:最后我安装了盗版的VMware8,升级了一下(会提示你卸载旧版本),也就没有下面一堆的乱七八糟的问题了,但那个192.168.137.1还是由那个注册表修改下,NAT方式Linux也就能上网了。
背景:重装系统后,配置Vmware后有可能里面的Linux无法上网。尽管IP一样的,但是就他妈的上不了外网,给升级Rpm包带来困难,路由如下:
root@192.168.137.128:~# traceroute baidu.com
traceroute to baidu.com (220.181.111.86), 30 hops max, 60 byte packets
1  192.168.137.2 (192.168.137.2)  0.348 ms  0.307 ms  0.295 ms
2  * * *
3  * * *
4  * * *
修改后是这样的:
root@192.168.137.128:~# traceroute baidu.com
traceroute to baidu.com (220.181.111.86), 30 hops max, 60 byte packets
1  192.168.137.1 (192.168.137.1)  0.188 ms * *
2  * * *
3  * * *
。。。。。。
29  * * *
30  * * *
也就是说还是没明确的路由,但Ping是通的,Curl是通的,能获取到数据就是Ok。

......
Is this ok [y/N]: y
Downloading Packages:
traceroute-2.0.14-2.el6.x86_64.rpm    
......
Running Transaction
  Installing : 3:traceroute-2.0.14-2.el6.x86_64    
  Verifying  : 3:traceroute-2.0.14-2.el6.x86_64    
Installed:
  traceroute.x86_64 3:2.0.14-2.el6      
Complete!
________________________________________________________________________________________________________
防火墙是要开启的,否则在共享时会返回null的问题:
1.services.msc
2.找到:Windows Firewall,启动类型:自动,启动:让服务状态为已启动。
——网上其实很多方法,都不行,我想可能是Vmware6.0和其下面的虚拟机的一个重装后的小Bug—————
解决办法:【第8条才是关键,特别注意。】
0)删除:修改 /etc/udev/rules.d/70-persistent-net.rules 文件
删除掉 关于 eth0 的信息。修改 第二条 eth1 的网卡的名字为 eth0. 重启服务器。
http://jackxiang.com/post/5651/
1)移动:下ifcfg-eth0到ifcfg-eth0.bak
2)关闭:ifconfig eth0 down
3)启动:ifconfig eth0 up
4)  重置:/etc/init.d/network reload
5)还原:ifcfg-eth0.bak -》ifcfg-eth0
6)重启:service network restart
7)把services.msc里的Vmware服务都全开了。
8)一系列都做了通过service network restart还是不能获取到新的DHC ip段:
VMware下->Edit->Virtue Network Settings...->DHCP->选 Vmware8(properties)->Start IP address(这块由:192.168.137.128修改最后一位:129),也就再service network restart 获取到129了,再修改回去就成(我估计这里之所以修改128成129是因为DHCP有缓存:192.168.157.128终于变为:192.168.137.128),呵呵,不容易,不知vmware的高版本有没有这个问题。
9)有时间win7要修改成:192.168.137.128 才能上网,而前面默认就是128,你得修改下vmware下的linux才能变IP第三位(由129变到128),而你修改的是最后一位128到129,于是你想还回去,可就又不行了,这也是vmware6.0的问题,这样就Ok了:
你再修改为更低:如:192.168.137.120 (128),再修改下注册表到另外的IP(192.168.138.0),再启动Vmware进行修改到:192.168.138.128。为此,你再关闭后修改注册表改回:192.168.137.0,启动vmware还回去(192.168.137.128)就可以了。
其实以上所有操作都是为了能让vmware下的linux能够获取到正确且能上网的ip:192.168.137.128。这个128是由dhcp确定的,必须修改,但修改后又有可能上不了外网。(这点也是奇怪的),也就只能这样折腾了,vmware6.0害人呐,呵呵。

最后,这个Vmware6.0下的虚拟Linux也就可以上网更新rpm了,NAT的Vmware6.0生成的Vmware8的访问类型:无法连接到Internet(其实也能访问),再就是防火墙要打开,否则共享会出现null的提示。
vi /etc/sysconfig/network-scripts/ifcfg-eth0  
阅读全文
https://bitbucket.org/PinIdea/fcgi_ext/
老外点评:
该用法有点意思,不过是特定场景下的应用:
有点像分布式事务
规避php的高资源消耗
原先的php代码中需要访问solr获得搜索结果,然后回传nginx
但是solr不稳定,或者说获得结果的时间比较长,不确定
这样php代码必须得持有很多资源等待结果
所以导致系统负载很大
改进方案就是在nginx和php之间增加golang的deamon程序
让golang去等待搜索结果
得到结果后,扔给后方的php,再回传nginx
所以golang等待的时候,就不会持有那么多资源
每次vim 一个文件,光标都在最上面的位置,不是上次我编辑的位置了..
进入vim后键入:
'0
即回到当初你编辑的位置
ctrl + o 回到光标回到上次位置
ctrl+i,ctrl+o跳转位置,完全没看手册啊

try  Ctrl+ o
配合ctrl + ] 阅读代码时尤其便捷
——————————————————————
PS: 如果想把光标停止在指定的行, 这样
vim +n urfile // n为行号
如果要停留在行尾, 这样
vim + urfile
来自:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1024941&page=1
http://blog.longwin.com.tw/2012/09/vim-last-read-line-2012/
http://bbs.chinaunix.net/thread-1271757-1-1.html


vim-重新打开回到上次所编辑文件的位置:
应用场景:
在每次退出一份文件后再重新打开该文件时,希望光标停留在当时退出的地方;也就是说当我程序写到hello.c的第100列时突然有事必须关电脑了,那在我下次打开电脑以vim打开hello.c, 希望光标还是停留在第100列,怎么办?

解决方案就是在.vimrc里面加上这一行即可:
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif  

google大神的礼物: 
http://bbs.chinaunix.net/viewthread.php?tid=1024941&page=1
我的无线WIFI设置成这个iP以后,连接到这个WIFI的用户才能上网,设置成192.168.0.1就不行,为什么?
192.168.136.*也不行,但我不知道为什么?是不是192.168.137.*这个IP 段具有特别的意义?

是这样的:因为在192.168.1.0/24这个的意思就是说前24位是网络位,而后八位是主机位
在你的网关中规定了,子网掩码是255.255.255.0对吧?这个的意思和/24一样,只不过是另一种表示方式,而你的网关地址应该是192.168.137.*对吧,这两个数据确定了你网络192.168.137.0
并不是这个ip有什么特别,在路由器里设置一下就好了

点击确定(OK)之后,将会出现如下的说明:
大致是说,将会自动把无线网卡的ip地址设置成为192.168.137.1的地址。
点击确定(OK),即可。
win7简单搭建WIFI热点使iphone快速上网(很仔细)
2012-1-26 12:35:21 上传下载附件 (27.5 KB)


(10)、这个时候查看无线网卡的IP地址,确保一定要是上面提示说明的IP地址。
ip地址:192.168.137.1
掩码:255.255.255.0


摘录:http://bbs.app111.com/thread-176775-1-1.html
分页: 17/23 第一页 上页 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 下页 最后页 [ 显示模式: 摘要 | 列表 ]