如何获取正在运行的脚本而不是 shell 的 PID?

如何获取正在运行的脚本而不是 shell 的 PID?

运行./run_func_and_get_pid.sh有以下内容

#!/bin/bash

run () {
    while true
    do
        "$@" & echo -n $! > duh && echo "" `cat duh` `cat dih`
        sleep 5
    done
}

run echo -n my name is mudd & echo -n $$ > dih

输出

my name is mudd 392056 392054
my name is mudd 392060 392054
my name is mudd 392066 392054
my name is mudd 392070 392054
my name is mudd 392074 392054
my name is mudd 392082 392054
my name is mudd 392087 392054
my name is mudd 392091 392054
my name is mudd 392095 392054
my name is mudd 392122 392054
my name is mudd 392126 392054
my name is mudd 392130 392054
my name is mudd 392134 392054
my name is mudd 392139 392054
my name is mudd 392143 392054
my name is mudd 392147 392054
my name is mudd 392151 392054
my name is mudd 392160 392054
my name is mudd 392164 392054
. . .

邮政建议这392054将是 pidrun_func_and_get_pid.sh但后来我明白了

$ ps aux | grep run_func
. . .
user   392055  0.0  0.0   9632  1852 pts/5    S    09:51   0:00 /bin/bash ./run_func_and_get_pid.sh
user   398763  0.0  0.0   9040  2508 pts/6    S+   10:10   0:00 grep -I --color=auto run_func

$ ps aux | grep 392054
user   398975  0.0  0.0   9040   720 pts/6    S+   10:13   0:00 grep -I --color=auto 392054

我只能猜测这392054是我运行命令时生成的 bash shell。无论进程是什么,它都已经退出了。

如何获取正在运行的脚本的 PID,而不是脚本的父级?

答案1

这:

run ... & echo ...

分叉一个新的 shell 进程在后台运行run,然后使用echo.后者不会运行很长时间,因此主脚本退出得相当快,并且确实$$指向一个已经退出的进程。

在您答案的版本中,您没有启动后台进程run(实际上似乎没有原因),因此它与主脚本在同一进程中运行。

对于一个也许更简单的例子,尝试例如

#!/bin/bash
echo "main script: $$"
f() {
    sleep 5;
    echo "bg job: $BASH_PID"
    ps "$BASH_PID";
}
f &

所以:

$ bash bg.sh; sleep 3
main script: 32553
bg job: 32554
  PID TTY      STAT   TIME COMMAND
32554 pts/1    S      0:00 bash bg.sh

答案2

当我开始时我没有这个问题的答案,但现在找到了答案。

392054似乎是函数的 PID run,因为如果我修改脚本来执行以下操作,我会得到我所期望的结果:

#!/bin/bash

run () {
    while true
    do
        "$@" & echo -n $! > duh && echo "" `cat duh` `cat dih`
        sleep 5
    done
}

echo -n $$ > dih
run echo -n my name is mudd

相关内容