Bash 运行一组两个children在后台,稍后杀掉他们
Bash run a group of two children in the background and kill them later
让我们像这样将两个命令(cd
和 bash ..
)组合在一起:
#!/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
让我们像这样将两个命令(cd
和 bash ..
)组合在一起:
#!/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