linux如何用Shell编写脚本获取进程目录下的cwd路径和exe路径

duxianer 2010-02-19 12:53:29
怎么用Shell编写一个脚本,作用是ps aux |grep java查看Java进程后,再用ls -l /proc/pid取得每一个进程的详细信
息,然后再获取每一个进程目录下的cwd路径和exe路径,最重要是要能取得每一个进程的cwd和exe的路径
怎么用脚本编写啊
很急啊。
...全文
599 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
duxianer 2010-02-20
  • 打赏
  • 举报
回复
没事没事
解决了就好
本身通过文字描述就会产生误解的
是我没说明清楚
谢谢你
steptodream 2010-02-20
  • 打赏
  • 举报
回复
引用 13 楼 duxianer 的回复:
好了好了
终于好了
非常感谢!!

我理解错了 要一开始就直接修改你给的那个就好了
duxianer 2010-02-20
  • 打赏
  • 举报
回复
好了好了
终于好了
非常感谢!!
steptodream 2010-02-20
  • 打赏
  • 举报
回复
9楼错误的原因是 tomcat和resin不是出现在最后 是我理解错了
steptodream 2010-02-20
  • 打赏
  • 举报
回复
我知道了 晕 我直接更改你写的那个代码

#!/bin/bash
pid=`ps axu | grep "java" | grep -v "grep" | awk '{print $2}'`
for evry_pid in ${pid}
do
exe_path=`ls -l /proc/${evry_pid} | grep "exe ->" | grep -v "grep" | awk '{print $NF}'`
cwd_path=`ls -l /proc/${evry_pid} | grep "cwd ->" | grep -v "grep" | awk '{print $NF}'`
pid_name=`ps ${evry_pid} | grep -v "grep" | awk '{print $NF}'`
if [[ `ps ${evry_pid} | grep -i "tomcat" | grep -v "grep"` != "" ]]
then
pid_name="tomcat"
elif [[ `ps ${evry_pid} | grep -i "resin" | grep -v "grep"` != "" ]]
then
pid_name="resin"
fi
echo ${evry_pid}:${pid_name}
echo "exe_path:"${exe_path}
echo "cwd_path:"${cwd_path}

done

duxianer 2010-02-20
  • 打赏
  • 举报
回复
打出来的还是跟没做判断之前一样
7910:Fw_Deal.jar
exe_path:/usr/local/java/bin/java
cwd_path:/usr/local/japp/Fw_Deal
24931:FaceDeal_fat.jar
exe_path:/usr/local/jdk1.6.0_02/jre/bin/java
cwd_path:/usr/local/japp/FaceDeal
31174:-Dcata
exe_path:/usr/local/jdk1.6.0_02/bin/java
cwd_path:/usr/local/tomcat/bin
8744:com.caucho.
exe_path:/usr/local/jdk1.6.0_02/bin/java
cwd_path:/usr/local/resin-3.1.0
9315:-Dcom.sun.manageme
exe_path:/usr/local/jdk1.6.0_02/bin/java
cwd_path:/usr/local/resin-3.1.0
也就是if没起到作用
还有什么别的办法吗
steptodream 2010-02-20
  • 打赏
  • 举报
回复

#!/bin/bash
pid=`ps axu | grep "java" | grep -v "grep" | awk '{print $2}'`
for evry_pid in ${pid}
do
exe_path=`ls -l /proc/${evry_pid} | grep "exe ->" | grep -v "grep" | awk '{print $NF}'`
cwd_path=`ls -l /proc/${evry_pid} | grep "cwd ->" | grep -v "grep" | awk '{print $NF}'`
pid_name=`ps auxw | grep ${evry_pid} | grep -v "grep" | awk '{print $NF}'`
if [[ `echo ${pid_name} | grep -i "tomcat" | grep -v "grep"` != "" ]]
then
pid_name="tomcat"
elif [[ `echo ${pid_name} | grep -i "resin" | grep -v "grep"` != "" ]]
then
pid_name="resin"
fi
echo ${evry_pid}:${pid_name}
echo "exe_path:"${exe_path}
echo "cwd_path:"${cwd_path}

done
steptodream 2010-02-20
  • 打赏
  • 举报
回复
等下 我给你改 你就是要PS之后最后的那个名字呗?
duxianer 2010-02-20
  • 打赏
  • 举报
回复
我要的是ps过后的进程名
例如该进程root 24931 0.0 1.7 666448 35516 ? S Sep22 697:26 /usr/local/jdk1.6.0_02/jre/bin/java -jar FaceDeal_fat.jar
要的是FaceDeal_fat.jar
duxianer 2010-02-20
  • 打赏
  • 举报
回复
不对啊,执行后进程名全是Java了
我有一个进程是tomcat 进程,但该进程名很长
root 31174 0.0 9.2 749756 190724 ? S Oct19 213:18 /usr/local/jdk1.6.0_02/bin/java -Djava.endorsed.dirs=/usr/local/tomcat/common/endorsed -classpath /usr/local/jdk1.6.0_02/lib/tools.jar:/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/commons-logging-api.jar -Dcatalina.base=/usr/local/tomcat -Dcata
所以如果是该进程的话,直接输出"tomcat"
不是tomcat的进程输出进程的进程名
也就是要做个判断吧,我就是不会做判断
steptodream 2010-02-20
  • 打赏
  • 举报
回复

#!/bin/bash
pid=`ps axu | grep "sshd" | grep -v "grep" | awk '{print $2}'`
for evry_pid in ${pid}
do
exe_path=`ls -l /proc/${evry_pid} | grep "exe ->" | grep -v "grep" | awk '{print $NF}'`
cwd_path=`ls -l /proc/${evry_pid} | grep "cwd ->" | grep -v "grep" | awk '{print $NF}'`
pid_name=`basename ${exe_path}`
echo ${evry_pid}:${pid_name}
echo "exe_path:"${exe_path}
echo "cwd_path:"${cwd_path}

done
duxianer 2010-02-20
  • 打赏
  • 举报
回复
你写的脚本完全能用,真是太谢谢你了
不过现在又要加点东西
就是要在
echo ${evry_pid}:
后面输出进程的名字,但是有的进程名很长,比如tomcat进程,如果遇到tomcat进程,就直接打出tomcat,如果是别的进程,就打出进程名。
这个地方我搞了好久也没判断出来,我把我写的发出来,你看看哪里不对啊
#!/bin/bash
pid=`ps axu | grep "java" | grep -v "grep" | awk '{print $2}'`
for evry_pid in ${pid}
do
exe_path=`ls -l /proc/${evry_pid} | grep "exe ->" | grep -v "grep" | awk '{print $NF}'`
cwd_path=`ls -l /proc/${evry_pid} | grep "cwd ->" | grep -v "grep" | awk '{print $NF}'`
pid_name=`ps ${evry_pid} |grep -v "COMMAND" | awk '{print $NF}'`
if ["$(ps ${evry_pid} |grep tomcat)" != ""]
then
pid_name="tomcat"
echo ${evry_pid}:${pid_name}
elif ["$(ps ${evry_pid} |grep resin)" -ne ""]
then
pid_name="resin"
echo ${evry_pid}:${pid_name}
else
echo ${evry_pid}:${pid_name}
fi
echo "exe_path:"${exe_path}
echo "cwd_path:"${cwd_path}

done
steptodream 2010-02-19
  • 打赏
  • 举报
回复
引用 2 楼 duxianer 的回复:
是redhat的2.6.18的

那就应该没问题
CentOS本来就是Redhat系的
你可以拿去试试啊 不行的话我再给你改改
duxianer 2010-02-19
  • 打赏
  • 举报
回复
是redhat的2.6.18的
steptodream 2010-02-19
  • 打赏
  • 举报
回复
不知道你的系统是哪个发行版的
我写了一个简单的 在CentOS5.4下可用
输出了每个进程的id对应的cwd路径和exe路径

#!/bin/bash
pid=`ps axu | grep "java" | grep -v "grep" | awk '{print $2}'`
for evry_pid in ${pid}
do
exe_path=`ls -l /proc/${evry_pid} | grep "exe ->" | grep -v "grep" | awk '{print $
NF}'`
cwd_path=`ls -l /proc/${evry_pid} | grep "cwd ->" | grep -v "grep" | awk '{print $
NF}'`
echo ${evry_pid}:
echo "exe_path:"${exe_path}
echo "cwd_path:"${cwd_path}
done

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧