背景:而我的情况是因为强行卸载了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


一、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了之后,学了一招。原来只有用“.”当前目录代替“*”就好了
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
子进程和主进程得判断一下,否则会运行两次:



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
环境: 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
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
阅读全文
背景:通过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
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 是挂载在本地的目录
    * fuser -m 找出其所有进程:fuser -m /dev/ttyACM0 | awk '{for(i=1;i<=NF;i++) if($i ~ /^[0-9]+$/) print "ps -p " $i}'|sh
    * 显示: /media/share: 25023c  #25023c   是进程编号,25023是进程PID。用ps aux|grep 25023进行查看是哪个进程导致出现device is busy

问:lsof -p 1498 | grep ttyACM0
没有输出任何内容,是它有可能打开过,可能并闭了是么,内核会记录下来,我只是查到当时打开过,是这个意思吗
答:是的,你的理解是正确的。即使进程已经打开了一个文件,但在某些情况下,它可能会在后来将其关闭。在这种情况下,`lsof`命令可能不会显示任何与该进程相关的文件描述符。内核确实会记录文件的打开和关闭事件,但是通常情况下,这些记录是暂时的,一般情况下不会保留太长时间。

如果你想要更详细地追踪设备的使用情况,你可能需要使用其他工具或技术,如系统日志(`/var/log/messages`或`/var/log/syslog`),来查看设备的活动历史记录。
—————————————————————某个文件是谁在读取,反查进程有用———————————————————————————————
umount /data/htdocs/xiyou.cntv.cn/application/views/themes/default/nettv/adp
/data/htdocs/xiyou.cntv.cn/application/views/themes/default/nettv/adp was not found in /proc/mounts 解决办法:
解决:
umount 时使用 -l 命令。
umount /img1/bbs/img1.bbs.cctv.com -f -l  #当-f强制不行,还得-l ,也就是lazy选项合用才行,再不行只有杀死对应的占用目录的进程。
sudo umount -l /data/htdocs/xiyou.cntv.cn/application/views/themes/default/nettv/adp
       -l     Lazy  unmount. Detach the filesystem from the filesystem hierarchy now, and cleanup all references to the filesystem as
              soon as it is not busy anymore.  (Requires kernel 2.4.11 or later.)
来自:https://blog.csdn.net/robertsong2004/article/details/41346629



[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
/home/irdcops/shell/hiwifi/hiwificonn.sh  
chmod +x /home/irdcops/shell/hiwifi/hiwificonn.sh


yum remove NetworkManager
上在这样是不行的,有可能是网IP还在,只是访问有问题:
/home/irdcops/shell/nmcli/nmcli.sh

*/1 * * * *   /home/irdcops/shell/nmcli/nmcli.sh >> /data/logs/nmcli/nmcli.log

sh  /home/irdcops/shell/nmcli/nmcli.sh
123.125.114.144 Ping is successful.
114.114.114.114 Ping is successful.
111.161.64.48 Ping is successful.


Crontab:



简单的判断Wifi的那个:
/home/irdcops/shell/nmcli/nmcli.sh

Crontab:



实践发现,这块如果是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
加上权限:


一)CentOS6最终这样写,以eth0网卡为例:


阿里私有云取Eth0:
/sbin/ifconfig eth0|grep "inet"|awk -F' ' '{print $2}'

二)CentOS7,因ifconfig的返回ip格式有变得这样:
echo -ne "\e]2;K8S仿真机-老武在上面测试@$(/sbin/ifconfig eth0|grep "inet"|cut -f2 -d:|awk '{print $2}')\a"  

sh  /etc/sysconfig/bash-prompt-xterm
Docker仓库机@CentOS7@10.71.182.163


实践发现即使unset进入了,还是会出现SecureCRT的标签没有变化(PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm ,没有进入到默认的分支里去),于是自己 在/etc/bashrc 在判读的前面加了几行Shell,解决了问题,如下:AddTime:2018/05/03

进了这里面去了,但是标签没有变化:

-------------------------------------------------加上可执行权限---------------------------------------------------------
-bash: /etc/sysconfig/bash-prompt-xterm: 权限不够
root@101.200.228.135:~# chmod a+x /etc/sysconfig/bash-prompt-xterm
[/codes]

———————————————————————————————————————————————————————————————
有时会不小心在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  #[ -z STRING ] “STRING” 的长度为零则为真。  https://blog.csdn.net/longyinyushi/article/details/50728049
    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/7下面的安装方法及查找某命令在哪个包的方法:http://jackxiang.com/post/7038/
一)rpm -qf /bin/dig
bind-utils-9.11.4-9.P2.el7.x86_64
安装DNS服务器的时候,想测试一下DNS服务器,发现没有host dig nslookup命令,原来是没有安装bind-untils,立即yum install bind-untils搞定如下:
sudo yum install bind-utils -y
它们各自的位置在:
[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
分页: 32/40 第一页 上页 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 下页 最后页 [ 显示模式: 摘要 | 列表 ]