一开始就为我的英语道歉。
我在服务器上有一个正在运行的进程,当我执行时:
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
那么,我如何从脚本运行的地方获取完整路径?我有很多名称完全相同的脚本,但它们是从不同的位置运行的,我需要知道给定脚本的运行位置。
感谢您的回复!
答案 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
更改为脚本名称即可。