如何检查已经运行的进程的路径?

时间:2014-09-25 11:54:50

标签: linux bash process path pid

一开始就为我的英语道歉。

我在服务器上有一个正在运行的进程,当我执行时:

ps -aux | grep script.sh

我得到了这样的结果:

root     28104  0.0  0.0 106096  1220 pts/7    S+   08:27   0:00 /bin/bash ./script.sh

但是这个脚本是从例如。 /home/user/my/program/script.sh

那么,我如何从脚本运行的地方获取完整路径?我有很多名称完全相同的脚本,但它们是从不同的位置运行的,我需要知道给定脚本的运行位置。

感谢您的回复!

4 个答案:

答案 0 :(得分:2)

尝试以下脚本:

for each in `pidof script.sh`
do
   readlink /proc/$each/cwd
done

这将找到所有运行的script.sh脚本的pid.s并找到/ proc的相应cwd(当前工作目录)。

答案 1 :(得分:1)

使用pwdx 用法:pwdx pid ...   (显示进程工作目录) 例如,

pwdx 20102

其中20102是pid 这将显示进程的进程工作目录

答案 2 :(得分:0)

#!/bin/bash

#declare the associative array with PID as key and process directory as value
declare -A dirr

#This will get the pid of the script
pid_proc=($(ps -eaf | grep "$1.sh" | grep -v "grep" | awk '{print $2}'))


for PID in ${pid_proc[@]}
do
    #using Debasish method
    dirr[$PID]=$(pwdx $PID)
    # Below are different process to get the CWD of running process
    # using user1984289 method
    #dirr[$PID]=$(readlink /proc/"$PID"/cwd)
    #dirr[$PID]=$(cd /proc/$PID/cwd; /bin/pwd)
done

# iterate using the keys of the associative and get the working directory
for PID in "${!dirr[@]}"
do
 echo "The script '$1.sh' with PID:'$PID' is in the directory '${dirr[$PID]}'"
done

答案 3 :(得分:0)

使用pgrep获取实例的PID,然后阅读相关CWD目录的链接。基本上,与@ user1984289采用相同的方法,但使用pgrep而不是pidof,这与我系统上的bash脚本名称不匹配(即使使用-x选项):

for pid in $(pgrep -f foo.sh); do readlink /proc/$pid/cwd; done

只需将foo.sh更改为脚本名称即可。