如何将subshell PID存储在变量中,以便稍后可以终止subshell及其后台进程?

gstyhher  于 2023-03-03  发布在  Shell
关注(0)|答案(3)|浏览(97)

因此,假设我正在运行一个带有后台进程的子shell,如下所示:

(command &)

我希望能够将这个子进程的PID存储到一个bash变量中,这样我就可以在以后终止子shell和它正在运行的后台进程。
注意:这很可能是一个重复的问题,但我正在努力实现许多其他的答案。因此,即使这个问题被标记为重复,如果有人仍然可以提供答案,我将不胜感激。
我尝试过一些事情:

pid="$((echo "$BASHPID" && command &))"
pid2="$((command & echo "$BASHPID"))"
pid3=(echo "$BASHPID" && command &)
pid4=(command & echo "$BASHPID")
jpfvwuh4

jpfvwuh41#

一个想法:

$ read -r x < <(sleep 240 & echo $!)       # alternative: replace $! with $BASHPID
                ^^^^^^^^^        ^^    
$ echo "$x"
1887
^^^^
$ ps -aef|egrep sleep
myuser    1887       1 pty1     16:00:17 /usr/bin/sleep
          ^^^^                                    ^^^^^
$ pgrep -a sleep
1887 sleep 240
^^^^ ^^^^^^^^^
23c0lvtd

23c0lvtd2#

https://en.wikipedia.org/wiki/Inter-process_communication的方式有很多种,例如使用fifo:

pidfile=$(mktemp -n)
mkfifo "$pidfile"
(command & echo $! > "$pidfile")
read pid < "$pidfile"
rm "$pidfile"
djp7away

djp7away3#

也许实现它的最短方法是使用coproc

#! /bin/bash

coproc ./mycommand
pid=$COPROC_PID

相关问题