ที่จริงผมแสดงให้เห็นว่าวิธีการเรียงลำดับของสิ่งนี้อาจจะมีการทำในคำตอบอื่นที่นี่ คำตอบนั้นเป็นคำถามเกี่ยวกับการทำให้มั่นใจว่ามีการบันทึก 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
'sเป็นปฏิบัติการและวิ่งในของ&background
&backgrounded ( subshell )
rms /tmp/file0-9
ไฟล์สคริปต์10 และechoes
บรรทัดทุกวินาทีในทั้ง 10 ไฟล์ ฉันจับภาพบางส่วน$info
จากกระบวนการปฏิเสธและนำเสนอผ่าน$(command substitution). While ps
รายงานภาพนิ่งที่$pid
ฉันจับฉันรู้ว่ามันยังทำงานอยู่ดังนั้นฉันsleep.
เมื่อมันเสร็จสมบูรณ์บรรทัดในทั้ง 10 ไฟล์จะถูกนับด้วยwc.
หลังจากที่คุณเรียกใช้กระบวนการด้วยวิธีนี้คุณสามารถปิดกระบวนการหลักดั้งเดิมได้อย่างอิสระและมันจะเก็บไว้ในรถบรรทุก - มันถูกปฏิเสธอย่างมีประสิทธิภาพ นอกจากนี้ยังหมายความคุณไม่สามารถใช้การชุมนุมwait
คำสั่ง แต่รอps
'sผลตอบแทนที่ควรจะมีประสิทธิภาพมากขึ้นในกรณีใด ๆ
มูลค่าการกล่าวขวัญผมคิดว่าก็คือกระบวนการที่เป็นจริงในตอนแรกเรียก$(command substitution)
และprintfs
ฉัน$info
ฉันต้องการได้อย่างมีประสิทธิภาพดังนั้นฉันสามารถควบคุมได้ แต่ทันทีที่มันลดลงเทอร์มินัลเอาต์พุตด้วยexec 1>&2
(ซึ่งถูกปิดใน subshell เดียวกันด้วย2>&-
)กระบวนการจะหนีและฉันต้องรอรอบอีกด้านหนึ่ง ค่อนข้างดีที่สุดในโลกทั้งสองโดยเฉพาะอย่างยิ่งถ้าคุณใช้มันเพื่อจัดการกับอินพุตท่อตราบใดที่คุณสามารถปิดล้อมการเปลี่ยนเส้นทางและผู้นำกระบวนการทั้งหมด
ทุกอย่างเป็นเพียงการสาธิตที่นี่ สิ่งที่คุณต้องใช้ในการทำงานนี้คือสคริปต์อันดับต้น ๆ และ:
info="$(($script_path &)2>&- &)"
หมายเหตุ:นี่จะพิมพ์ไปที่เทอร์มินัลสิ่งที่ฉันต้องการแสดงให้เห็นเท่านั้น ตามที่ระบุไว้ใน$PPID,
กระบวนการนี้ถูกปฏิเสธโดยสถานีและเป็นลูกโดยตรงของ$PID 1.
หากคุณต้องการเรียกใช้สองสิ่งนี้พร้อมกันและรอพวกเขาคุณสามารถส่งps
ทั้งสองของ pids และรอ