Bash 运行一组两个children在后台,稍后杀掉他们

Bash run a group of two children in the background and kill them later

让我们像这样将两个命令(cdbash ..)组合在一起:

#!/bin/bash

C="directory"
SH="bash process.sh"

(cd ${C}; ${SH})&
PID=$!
sleep 1
KILL=`kill ${PID}`

process.sh 打印日期(每秒五次):

C=0
while true
do
    date
    sleep 1
    if [ ${C} -eq 4 ]; then
        break
    fi
    C=$((C+1))
done

现在我实际上希望后台子进程在 1 秒后立即被终止,但它就像什么也没发生一样继续进行。 INB4:"Why don't you just bash directory/process.sh" 不,这个 cd 只是一个例子。 我做错了什么?

当您希望进程就地替换自身时使用 exec,而不是使用自己的 PID 创建新的子进程。

也就是说,这段代码可以创建两个个子进程,将第一个的PID存储在$!中,然后使用第二个执行process.sh:

# store the subshell that runs cd in $!; not necessarily the shell that runs process.sh
# ...as the shell that runs cd is allowed to fork off a child and run process.sh there.
(cd "$dir" && bash process.sh) & pid=$!

...而此代码只创建了 一个 子进程,因为它使用 exec 使第一个进程替换为第二个进程:

# explicitly replace the shell that runs cd with the one that runs process.sh
# so $! is guaranteed to have the right thing
(cd "$dir" && exec bash process.sh) &

您可以使用 "ps --ppid $$" 检查所有子进程 所以,

#!/bin/bash

C="directory"
SH="bash process.sh"

(cd ${C}; ${SH})&
PID=$!
sleep 1
ps -o pid= --ppid $$|xargs kill