startScript.sh
是在/root/script/startScript.sh
script1.sh
是在/root/script/test/script1.sh
script2.sh
是在/root/script/test/script2.sh
startScript.sh
看起来像下面
#!/bin/bash
#some code!
sh `pwd`/test/script1.sh 2>&1 &
sh `pwd`/test/script2.sh 2>&1 &
#some code
script2.sh
script1.sh
如下所示
#!/bin/bash
> `pwd`/process_ids.txt
while true;do
echo "The Process: `ps`" >> `pwd`/process_ids.txt
#some code to parse the process, etc. and echo it
done
事情是这样的,该process_ids.txt
文件正在创建/root/script
。但根据scriptx.sh
是pwd
。/root/scripts/test/
我显示了pwd
,scriptx.sh
它正在显示/root/script/
。我怎样才能得到pwd
的scriptx.sh
?
答案1
为什么不直接添加test/
到您要创建的文件的路径,即
#!/bin/bash
> `pwd`/test/process_ids.txt
while true;do
echo "The Process: `ps`" >> `pwd`/test/process_ids.txt
#some code to parse the process, etc. and echo it
done
答案2
最简单的方法是将其作为参数传递给脚本 1 和 2。因此,修改scriptx.sh
为(顺便说一下,使用$PWD
,没有理由运行外部命令):
#!/bin/bash
#some code!
sh "$PWD"/test/script1.sh "$PWD" 2>&1 &
sh "$PWD"/test/script2.sh "$PWD" 2>&1 &
#some code
以及script1.sh
和script2.sh
:
#!/bin/bash
dir="$1"
> "$dir"/process_ids.txt
while true;do
echo "The Process: `ps`" >> "$dir"/process_ids.txt
#some code to parse the process, etc. and echo it
done
更复杂的方法是从文件系统获取父脚本的 PWD /proc
。由于scriptx.sh
正在启动其他人,因此他们将可以访问变量scriptx.sh
中的 PID $PPID
。在 Linux 中,每个正在运行的进程都有一个指向其当前工作目录的链接/proc/PID/cwd
。因此,您可以保持scriptx.sh
不变并将其他修改为:
#!/bin/bash
dir="$(readlink -f /proc/$PPID/cwd)"
> "$dir"/process_ids.txt
while true;do
echo "The Process: `ps`" >> "$dir"/process_ids.txt
#some code to parse the process, etc. and echo it
done
答案3
你不需要得到或者经过任何人任何事。那已经完成了。分叉进程的当前工作目录是父进程的当前工作目录。因此,除非这些脚本正在更改其当前目录,并且如果是的话,这要么是预期行为,要么是您应该通过编辑来阻止它们执行的操作,那么当前工作目录对于每个人来说都是相同的。但如果有是由于某种原因存在差异,然后输出...
`pwd`
...将同样存在问题并且出于完全相同的原因,因此不能将其视为任何迹象。
不过,如果您确实想检查另一个进程的这些内容,并且您有另一个进程的 PID - 正如您script2.sh
在 shell 参数中所做的$!
那样,并且您可以使用 获取另一个进程的 PID jobs -p
,那么,在 Linux 系统上,您可以这样做:
cd -P /proc/"$!"/cwd;pwd;cd -
...这将首先更改为最后一个后台进程的当前工作目录,然后打印它,然后更改回当前 shell 的上一个当前工作目录,并打印它。