我实际上在这里的另一个答案中演示了如何完成这种事情。答案是关于确保后台进程维护2个日志的问题,所以我用10个示例进行了演示。
演示脚本
cat <<-\DEMO >|${s=/tmp/script}
printf 'tty is %s\nparent pid is %s\npid is pid=%s\n' \
"$(tty)" "$PPID" "$$"
exec 1>&2 ; nums=$(seq 0 9)
rm ${files=$(printf "/tmp/file%s\n" $nums)}
for n in $nums ; do { for f in $files ; do
echo "Line $n" >>"$f" ; done
sleep 1 ; } ; done
#END
DEMO
运行演示
s=/tmp/script ;chmod +x $s ;info="$(($s &)2>&- &)"
echo "$info" ; pid="${info##*=}" ; echo
while ps -p $pid >/dev/null ; do sleep 3 ; done
for f in /tmp/file[0-9] ; do
printf 'path : %s\tline count : %s\n' \
$f $(<$f wc -l)
done
输出:
tty is not a tty
parent pid is 1
pid is 12123
path : /tmp/file0 line count : 10
path : /tmp/file1 line count : 10
path : /tmp/file2 line count : 10
path : /tmp/file3 line count : 10
path : /tmp/file4 line count : 10
path : /tmp/file5 line count : 10
path : /tmp/file6 line count : 10
path : /tmp/file7 line count : 10
path : /tmp/file8 line count : 10
path : /tmp/file9 line count : 10
以上说明。它建立并运行一个名为脚本/tmp/script
, chmod
的它作为可执行文件,并运行它在&background
的&backgrounded ( subshell )
。
该脚本有rms /tmp/file0-9
10个文件,并且echoes
每秒钟一行一行地插入所有10 个文件中。我$info
从不知名的流程中捕获了一些内容,并通过我捕获的$(command substitution). While ps
静态报告将其呈现出来$pid
,我知道它仍在运行,所以我sleep.
完成后,所有10个文件中的行都被计入wc.
以这种方式调用流程后,您可以自由关闭其原始父流程,并且该流程将继续执行-实际上已被取消。这也意味着您不能使用常规wait
命令,但是在任何情况下等待ps
的返回都应该更可靠。
我认为,值得一提的是,该过程实际上是最初调用的,$(command substitution)
而printfs
我是$info
我想要的,因此我可以有效地控制它。但是,一旦它放弃了其终端输出exec 1>&2
(在与相同的子shell中关闭了2>&-
),则该过程转义,我不得不在另一端等待它。Kinda兼具两全其美的优势,特别是如果您使用它来处理输入管道,只要您能将所有重定向和流程领导者的思想牢记在心。
其他所有内容仅用于演示。您仅需运行以下脚本即可:
info="$(($script_path &)2>&- &)"
注意:这仅打印到终端上我想要演示的内容。正如$PPID,
该流程所指出的,此过程已被终端拒绝,并且是$PID 1.
如果您想同时运行其中两个并等待它们,则只需交出ps
两个pid并等待即可。