Tôi thực sự chứng minh chính xác làm thế nào loại điều này có thể được thực hiện trong một câu trả lời khác ở đây . Câu trả lời đó là một câu hỏi về việc đảm bảo 2 bản ghi được duy trì bởi một quy trình nền, vì vậy tôi đã chứng minh nó bằng 10.
Tập lệnh demo
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
Chạy thử
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
Đầu ra:
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
Những điều trên chứng tỏ. Nó được xây dựng và chạy một kịch bản được đặt tên /tmp/script
, chmod
là nó như là thực thi, và chạy nó trong &background
một &backgrounded ( subshell )
.
Tập lệnh rms /tmp/file0-9
10 tập tin và echoes
một dòng mỗi giây vào tất cả 10 tập tin. Tôi chụp một số $info
từ quá trình bị từ chối và trình bày nó qua $(command substitution). While ps
các báo cáo vẫn còn trên $pid
tôi chụp, tôi biết nó vẫn chạy nên sleep.
khi tôi hoàn thành, các dòng trong tất cả 10 tệp được tính vớiwc.
Sau khi bạn gọi một quy trình theo cách này, bạn có thể tự do đóng quy trình cha mẹ ban đầu của nó và nó sẽ tiếp tục vận chuyển - nó thực sự bị từ chối. Điều này cũng có nghĩa là bạn không thể sử dụng wait
lệnh thông thường , nhưng chờ đợi ps
sự trở lại sẽ mạnh mẽ hơn trong mọi trường hợp.
Đáng nói, tôi nghĩ, đó là quá trình thực sự được gọi ban đầu $(command substitution)
và printfs
tôi $info
muốn tôi có thể kiểm soát nó một cách hiệu quả. Nhưng ngay sau khi nó giảm đầu ra đầu cuối của nó với exec 1>&2
(được đóng trong cùng một mạng con với 2>&-
), quá trình sẽ thoát và tôi phải đợi nó ở đầu bên kia. Loại tốt nhất của cả hai thế giới, đặc biệt là nếu bạn sử dụng nó để xử lý các đường ống đầu vào, miễn là bạn có thể bao bọc tâm trí của mình xung quanh tất cả các chuyển hướng và các nhà lãnh đạo quá trình.
Mọi thứ khác chỉ là để trình diễn ở đây. Tất cả những gì bạn cần để chạy đây là tập lệnh hàng đầu và:
info="$(($script_path &)2>&- &)"
LƯU Ý: Điều này chỉ in ra thiết bị đầu cuối chính xác những gì tôi muốn thể hiện nó. Theo ghi nhận của$PPID,
quá trình này, thiết bị đầu cuối bị từ chối và là con trực tiếp của$PID 1.
Nếu bạn muốn chạy hai trong số này đồng thời và chờ đợi chúng, bạn có thể chỉ cần đưa ps
cả hai nắp của chúng và chờ đợi.