我有一个名为 test.sh 的脚本。这会调用另一个脚本 foo.sh,如下所示:
#!/bin/bash
echo "starting other script"
. ./foo.sh
foo.sh 脚本如下所示:
#!/bin/bash
sleep 10
echo "running"
sleep 10
现在,当我从终端执行以下操作时:
ps -def | grep foo.sh | grep -v grep
我从来没有得到结果。我可以在终端中看到脚本的输出,没问题,但是如何检查 foo.sh 是否正在运行?
答案1
您启动foo.sh
为. ./foo.sh
.
shell 脚本本身并不是一个进程。它由 shell 的实例(即进程)解释。
.
source
是在当前 shell 环境中执行命令的命令的别名。这意味着./foo.sh
由执行启动它的脚本的同一个 shell 执行。它不会创建新进程,这就是为什么您无法使用 找到它ps
。
您可以启动foo.sh
为./foo.sh
.在这种情况下,它将由 shell 的新实例执行,即进入新进程。
但是,根据它的作用,./foo.sh
完成后原始 shell 的执行在这两种情况下可能会有所不同。当foo.sh
在同一个shell中执行时,它改变的环境变量属于也执行原脚本的shell。更改它们可能会影响原始脚本。
当您foo.sh
在单独的脚本中运行时,它对环境变量进行的更改不会影响原始脚本。它们是不同的进程,不共享任何内容。
但我如何检查是否
foo.sh
正在运行?
这对于启动的脚本来说很容易,foo.sh
因为它会等到foo.sh
完成后再恢复执行。
从外部来看这可能是不可能的(或几乎不可能)。