http://blog.csdn.net/jccz_zys/archive/2006/12/11/1438215.aspx
我发现的获取linux进程的执行文件路径的方法有如下2个:
1、在c++代码里面通过函数gecpwd获取进程当前执行文件路径,通过日志或
控制台来显示当前进程的运行路径。这估计是大家看到这个标题就想到的
方法。
2、直接通过shell来查看,这也是我在实际情况中碰到的情况:
就是我们开发的系统,控制了在同一个路径下只能够运行一次,在实际部署
环境过程中会在不同的路径下提供不同的tcp端口号给不同的应用来测试联调,
这样,在以./cmd的形式运行多个程序后,会出现通过ps查看进程时,看到n多
的./cmd的同名进程在运行。一旦那个应用出现问题或者时间久了后,需要查找
对应目录时,不能够迅速定位那个进程是运行在那个具体的位置以及为谁服务。
具体做法就是:
1、以超级用户登陆
2、进入/proc目录
3、ps查看所有符合./cmd的进程,找出其对应的进程号
4、用ll命令: ll 进程号
如下显示一个示例:
[root@Cluster1 proc]# ll 22401
total 0
-r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 cmdline
-r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 cpu
lrwxrwxrwx 1 zhouys zhouys 0 Dec 11 11:10 cwd -> /home/zhouys/sbs/bin
-r-------- 1 zhouys zhouys 0 Dec 11 11:10 environ
lrwxrwxrwx 1 zhouys zhouys 0 Dec 11 11:10 exe -> /home/zhouys/sbs/bin/cbs (deleted)
dr-x------ 2 zhouys zhouys 0 Dec 11 11:10 fd
-r-------- 1 zhouys zhouys 0 Dec 11 11:10 maps
-rw------- 1 zhouys zhouys 0 Dec 11 11:10 mem
-r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 mounts
lrwxrwxrwx 1 zhouys zhouys 0 Dec 11 11:10 root -> /
-r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 stat
-r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 statm
-r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 status
/proc文件系统下的 进程号目录 下面的文件镜像了进程的当前运行信息,
从中可以看到:
cwd符号链接的就是进程22401的运行目录;
exe符号连接就是执行程序的绝对路径;
cmdline就是程序运行时输入的命令行命令;本例为:./cbs
cpu记录了进程可能运行在其上的cpu;显示虚拟的cpu信息
environ记录了进程运行时的环境变量
fd目录下是进程打开或使用的文件的符号连接
...
通过cwd直接进入进程运行目录,通过查看相关信息就可以定位此目录对应那个端口号,以及
定位是那个应用才使用此服务程序。
如何查看某个端口是由那个进程或命令所打开的?
http://www.ajaxstu.com/Linuxwangluozhishi/115075.html
Redhat AS 4.4 i386
发现我机器打开了一个80端口
用[code]
netstat -nltp |grep 80
lsof -i:80
fuser -n tcp 80
[/code]
都看不出事哪个命令或进程开的,最后根据经验发现是TUX开的。Tux是内核进程。
偶的问题是,有什么命令能发现这个内核进程,而不需要凭经验。
[[i] 本帖最后由 maluyao 于 2007-6-13 20:59 编辑 [/i]]
第二点:nlp 不够,你就用: avpn
完整的命令:
( for tcp port )
netstat -avpn 2>&1 | grep ^tcp |grep 80
( for udp port )
netstat -avpn 2>&1 | grep ^udp |grep 80
[root@kl ~]# netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.0.254:21 0.0.0.0:* LISTEN 1180/vsftpd
tcp 0 0 192.168.0.254:53 0.0.0.0:* LISTEN 1142/named
tcp 0 0 192.168.0.254:22 0.0.0.0:* LISTEN 1161/sshd
tcp 0 0 192.168.50.254:3128 0.0.0.0:* LISTEN 1211/(squid)
tcp 0 0 192.168.0.254:3128 0.0.0.0:* LISTEN 1211/(squid)
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 1142/named
udp 0 0 0.0.0.0:2048 0.0.0.0:* 1142/named
udp 0 0 0.0.0.0:2049 0.0.0.0:* 1211/(squid)
udp 0 0 192.168.0.254:53 0.0.0.0:* 1142/named
udp 0 0 0.0.0.0:3130 0.0.0.0:* 1211/(squid)
udp 0 0 0.0.0.0:67 0.0.0.0:* 1189/dhcpd
udp 0 0 192.168.50.254:69 0.0.0.0:* 1170/xinetd
raw 0 0 0.0.0.0:1 0.0.0.0:* 7 1189/dhcpd
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 1436473 25899/0 /tmp/ssh-XGAJo25899/agent.25899
[root@kl ~]#
进程那一栏就显示一个减号"-"
你可以执行以下service tux start 试试看。
[quote]原帖由 [i]ssffzz1[/i] 于 2007-6-13 20:05 发表于 2楼
netstat -nlp 难道不可以吗?
# netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ... [/quote]
这个软件我没用过。不过有一种技术好像是用常规的方法是看不到监听接口的。就是软件监听原始套接口,然后过滤出属于自己的数据包。这样是看不到监听口的。不过应该和你说的不同,这个用netstat -nlp是什么也看不到的,譬如抓包软件。
[code]
[root@test1 maintain]# netstat -avnpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2867/portmap
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3111/vsftpd
[/code]
我加了个"t"参数,代表tcp的意思。
[quote]原帖由 [i]deng_save_file[/i] 于 2007-6-13 20:11 发表于 3楼
第一点:要注意普通用户不能查看其他用户的进程名称。也就是你要用 root 来看。
第二点:nlp 不够,你就用: avpn
完整的命令:
( for tcp port )
netstat -avpn 2>&1 | grep ^tcp |grep 80 ... [/quote]
[[i] 本帖最后由 maluyao 于 2007-6-14 11:08 编辑 [/i]]
看来可以把机子扔了,还要它干嘛.
个人而言不喜欢搞在内核态的东西,宁愿用用户态的apache+squid
netstat lsof fuser 是通过标准的系统调用获取信息的,tux作为内核态http server ,看得到看不到关联都是正常的。反正看到80口被占用就ps看看,靠经验也没什么不好的
个人而言不喜欢搞在内核态的东西,宁愿用 ... [/quote]
偶也不喜欢,是别人无意中打开的。
难道是指安装系统预先装的apache 为内核态? 自己编译的为用户态? 觉得也不象,请指教。谢谢
素我愚昧。请问 什么叫内核态 ,用户态?
难道是指安装系统预先装的apache 为内核态? 自己编译的为用户态? 觉得也不象,请指教。谢谢 [/quote]
Tux 是基于内核的httpd服务器,很少人用,我这里也是被别人误开启的。
那就用你告诉我们的命令试试呗~~~
lsof 或 lsof -i
呵呵 别生气阿
哈哈 老师哦~~嘻嘻 !!1
哦耶~~!
[url]http://linuxdby.com/html/linux/beginner/20070505/26391.html[/url]
有较详细的资料,和我一样有疑问的,可以参考一下。
Redhat AS 4.4 i386
发现我机器打开了一个80端口
用
netstat -nltp |grep 80
lsof -i:80
fuser -n tcp 80
都看不出事哪个命令或进程开的,最后根据经验发现是TUX开的。Tux是内核进程。
偶的问题是,有 ... [/quote]
可以这样测试
[code]
[root@server1 ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to resin.example.com (127.0.0.1).
Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.1 200 OK
Content-Type: text/html
Date: Thu, 28 Jun 2007 03:47:39 GMT
Server: TUX/2.0 (Linux)
Content-Length: 25
ETag: "25-egcnlhim"
Accept-Ranges: bytes
Last-Modified: Tue, 24 Apr 2007 07:53:48 GMT
frank hello ok ok 070426
Connection closed by foreign host.
[/code]
看到了么? 这行 Server: TUX/2.0 (Linux)
[[i] 本帖最后由 frankzh 于 2007-6-29 12:05 编辑 [/i]]
[quote]原帖由 [i]frankzh[/i] 于 2007-6-29 12:03 发表于 19楼
可以这样测试
# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to resin.example.com (127.0.0.1).
Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.1 200 OK
Content-Type: text/ht ... [/quote]