如何获取linux进程的执行文件路径

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]]

deng_save_file
第一点:要注意普通用户不能查看其他用户的进程名称。也就是你要用 root 来看。
第二点:nlp 不够,你就用: avpn
完整的命令:
( for tcp port )
netstat  -avpn   2>&1    |  grep ^tcp  |grep 80
( for udp port )
netstat  -avpn   2>&1    |  grep ^udp  |grep 80

 

ssffzz1
netstat -nlp 难道不可以吗?
[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 ~]#

 

maluyao
我那个80是tcp端口,所以nlp和nltp没啥区别,
进程那一栏就显示一个减号"-"

你可以执行以下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]

 

ssffzz1
哦,这样啊。
这个软件我没用过。不过有一种技术好像是用常规的方法是看不到监听接口的。就是软件监听原始套接口,然后过滤出属于自己的数据包。这样是看不到监听口的。不过应该和你说的不同,这个用netstat -nlp是什么也看不到的,譬如抓包软件。

 

lihn
lsof 命令可以。。。。

 

maluyao
很遗憾,avnp参数也不行,结果如下
[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]]

 

qpfei$
没有办法,pstree看有没有tux,就是凭经验

 

wysilly
fuser -n tcp 80 没有返回吗?

看来可以把机子扔了,还要它干嘛.

 

qsxing
netstat -tuanp 呢

 

mxbao
lsof貌似很强大,应该能返回来的

 

qpfei$
netstat lsof fuser 是通过标准的系统调用获取信息的,tux作为内核态http server ,看得到看不到关联都是正常的。反正看到80口被占用就ps看看,靠经验也没什么不好的

个人而言不喜欢搞在内核态的东西,宁愿用用户态的apache+squid

 

maluyao
[quote]原帖由 [i]qpfei$[/i] 于 2007-6-14 15:19 发表于 12楼  
netstat lsof fuser 是通过标准的系统调用获取信息的,tux作为内核态http server ,看得到看不到关联都是正常的。反正看到80口被占用就ps看看,靠经验也没什么不好的

个人而言不喜欢搞在内核态的东西,宁愿用 ... [/quote]
偶也不喜欢,是别人无意中打开的。

 

aaronyou
素我愚昧。请问 什么叫内核态 ,用户态?
难道是指安装系统预先装的apache 为内核态? 自己编译的为用户态? 觉得也不象,请指教。谢谢

 

maluyao
[quote]原帖由 [i]aaronyou[/i] 于 2007-6-14 22:28 发表于 14楼  
素我愚昧。请问 什么叫内核态 ,用户态?
难道是指安装系统预先装的apache 为内核态? 自己编译的为用户态? 觉得也不象,请指教。谢谢 [/quote]


Tux 是基于内核的httpd服务器,很少人用,我这里也是被别人误开启的。

 

jiemin0228
老师也有你不会的~!!!!哈哈
那就用你告诉我们的命令试试呗~~~
     lsof  或 lsof  -i   
  呵呵   别生气阿
哈哈   老师哦~~嘻嘻 !!1
哦耶~~!

 

aaronyou
谢谢 楼主。
[url]http://linuxdby.com/html/linux/beginner/20070505/26391.html[/url]
有较详细的资料,和我一样有疑问的,可以参考一下。

 

maluyao
没有最佳答案,论坛又不准自摸,偶准备胡乱选一个当最佳了。

 

frankzh
[quote]原帖由 [i]maluyao[/i] 于 2007-6-13 16:47 发表于 1楼  
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]]

 

maluyao
这就又回到”经验“的问题了,如果telnet过去,什么反应都没有,不是还不知道么? 这次是tux,下次也许是Zux Aux呢

[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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值