****************************************
lsof 使用 -- list open file
查看一个进程打开了什么文件。
查看文件被那个进程打开。
查看哪个进程占用了端口
紧急恢复被删除的文件
****************************************

查看端口被谁使用, -i , -internet

#lsof -i 查看所有端口

#lsof -i -P 不解析端口名称

#lsof  -i  :8080 // 指定端口
#lsof  -i tcp  // 所有tcp 端口
#lsof  -i tcp:80  //特定tcp端口
#lsof  -i udp
#lsof  -i udp:9090 //特定udp 端口
#lsof -u root //列出root 用户打开文件
#lsof  /var/log/messages  //查看文件被谁使用
# lsof +D /usr/lib             //递归查找某个目录中所有打开的文件
加上+D参数,lsof会对指定目录进行递归查找,注意这个参数要比grep版本慢:
#lsof -c nginx        // -c -char 之意 查看某个程序打开了什么文件
比 lsof | grep nginx 少打几个字, 不带任何参数lsof 显示所有打开的文件
#lsof -p 12345        // -p -process 查看某个进程打开了什么文件

曾经碰到一个打开文件失败的例子. 当文件被操作1000次左右时(打开,写入,关闭),再打开失败.

用lsof -p 查看进程发现已经打开了1千多个句柄, 并由此确定了原来是函数调用了opendir(), 却没有调用closedir()所引起.


在/proc 目录下,其中包含了反映内核和进程树的各种文件。
/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,
当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。
lsof 列出的相关的信息都存储于以进程的 PID 命名的目录中,
例如: /proc/1234 中包含的是 PID 为 1234 的进程的信息。
每个进程目录中存在着各种文件,可以简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。
所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。
当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,
那么我们就可以通过lsof从/proc目录下恢复该文件的内容 (简单的说, 你删除了磁盘上文件,如果它对应的内存文件还没有删除,则可以恢复!)

假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:
# lsof |grep messages

syslogd   1283      root    2w      REG        3,3  5381017    1773647 /var/log/messages (deleted)

从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。
同时还可以看到/var/log/messages已经标记被删除了
查看文件内容
# head -n 10 /proc/1283/fd/2
导出文件
#cat /proc/1283/fd/2 > /var/log/messages



****************************************
sar: system activity reporter
检查cpu, 内存, 磁盘i/o 的瓶颈
****************************************
sar -u   //cpu
sar -q   //queue

sar -b   //I/O
sar -d   //device

sar -r   //ram
sar -B   //paging
sar -W   //swap

怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看
怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看

怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看

 

可以用vmstat 1 每一秒钟刷新一下,实时监视cpu,内存,system, io 状态。

****************************************
ssh登录慢,等待输入密码时间长
****************************************
修改/etc/ssh/ssh_config

将GSSAPIAuthentication设为 no

将UseDNS为no 设为 no

ssh –v 可以看到交互过程

ssh –vvv 显示log 最多

 

远程登陆:
windows 用securecrt 登陆
linux 用 ssh 终端登陆

例 ssh -l jiatv 192.168.11.29

以root 登陆 ssh -l root .....


一般是两点:

1. dns 反向解析:

trying to reverse map address 192.168.11.29  会等待很长时间

它根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法。
如果客户机的IP没有域名,或者DNS服务器很慢或不通,那么登录就会很花时间。
解决办法:
只需修改/etc/ssh/sshd_config,设置UseDNS为no即可

2. gssapi的问题

unspecified GSS failure 会等待很长时间
可能是与安全有关的问题
修改/etc/ssh/ssh_config,设置GSSAPIAuthentication no

重启一下服务: service sshd

 

这样修改过,登陆就象飞一样快了,很爽!

 

 

****************************************
使scp不用输入密码
****************************************
让你需要访问的机器拥有你机器的公钥。
第一步:生成rsa的密钥密匙对,。
使用命令 "ssh-keygen -t rsa"
生成的过程:
提示输入密钥对保存位置,直接回车,接受默认值就行了。
提示输入一 个不同于你的password的密码,直接回车,让它空着。当然,也可以输入一个

公共密钥保存在 ~/.ssh/id_rsa.pub
私有密钥保存在 ~/.ssh/id_rsa

第二步: 把这个密钥对中的公共密钥复制到你要访问的机器上去,
并保存为 ~/.ssh/authorized_keys.


你再用ssh scp sftp 之类的访问那台机器时,就不用输入密码了,
用在script上更是方便

如果想让B,C同时可以SCP from A不输入密码
则要把B、C的公钥都给 A;
操作步骤:
把两机器的id_rsa.pub中的数据都拷贝到A的/root/.ssh/authorized_keys文件中,
一行表示一条;

----------------------------------------

举例:
#scp -P 3422 abc.txt it@192.168.1.131:/home/it
如果是默认端口22,则不用-P [端口] 来指定了.

免密设置,要把本机的公钥copy到对方机器上,命名为authorized_keys
scp 时出现如下提示,免密不能成功,仍然要求输入密码
Agent admitted failure to sign using the key.
----------------------------------------
解決方式 在本机下,使用 ssh-add 指令将私钥加进来
# ssh-add   ~/.ssh/id_rsa  

如果出现以下错误, 不能在授权代理上打开连接
Could not open a connection to your authentication agent.
执行如下命令, 启动ssh 代理
# ssh-agent bash
然后再执行上述命令

如果出现 Host key verification failed

可以用ssh 先登陆一下,这样就永久添加了对方的ecdsa key, 在用scp 即可成功.

********************************************************************************

strace: 跟踪系统调用和信号。 跟踪,监视一个程序或进程的活动,系统函数调用。

strace 的常用选项
-f :除了跟踪当前进程外,还跟踪其子进程。
-o file :将输出信息写到文件file中,而不是显示到标准错误输出(stderr)。
-p pid :绑定到一个由pid对应的正在运行的进程。此参数常用来调试后台进程。
********************************************************************************
  
使用上述三个参数基本上就可以完成大多数调试任务了,下面举几个命令行例子:
strace -o ls.strace ls -al: 跟踪ls -al的运行,将输出信息写到文件/tmp/ls.truss中。
strace --o vim.strace -f vim: 跟踪vim及其子进程的运行,将输出信息写到文件vim.strace。
案例一:运行程序时出现Segment Fault错误
案例二:vim启动速度明显变慢, 跟踪在哪里变慢?程序都干了什么?
# strace -o vim.strace -r -f vim
  这里-r参数的作用是:在每行输出前加上相对时间戳
        -t 是绝对时间戳, -tt 带us 时间

------------------------------------------------------------
通过rpm 查询安装的配置文件和man 文档
通过 lsof 查询打开的配置文件和log文件
lsof 研究................  lsof 可以列出当时打开的文件,如果已经关闭了,就不列了。

 

Logo

更多推荐