Saya benar-benar menunjukkan dengan tepat bagaimana hal semacam ini dapat dilakukan dalam jawaban lain di sini . Jawaban itu adalah pertanyaan tentang memastikan 2 log dikelola oleh proses latar belakang, jadi saya menunjukkannya dengan 10.
Demo Script
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
Jalankan 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
Keluaran:
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
Di atas menunjukkan. Itu membangun dan menjalankan skrip bernama /tmp/script
, chmod
's sebagai executable, dan berjalan itu dalam &background
sebuah &backgrounded ( subshell )
.
Script rms /tmp/file0-9
10 file dan echoes
satu baris setiap detik menjadi 10 file . Saya menangkap beberapa $info
dari proses pembatalan dan mempresentasikannya melalui $(command substitution). While ps
laporan masih pada $pid
penangkapan saya, saya tahu itu masih berjalan jadi saya sleep.
Ketika selesai, garis-garis di semua 10 file dihitung denganwc.
Setelah Anda memohon suatu proses dengan cara ini Anda dapat dengan bebas menutup proses induk aslinya dan itu akan terus diangkut - itu secara efektif tidak diakui. Ini juga berarti Anda tidak dapat menggunakan konvensional wait
perintah, tetapi menunggu di ps
's kembali harus lebih kuat dalam hal apapun.
Layak disebutkan, saya pikir, adalah bahwa proses ini sebenarnya pada awalnya dipanggil $(command substitution)
dan printfs
saya yang $info
saya inginkan sehingga saya dapat secara efektif mengendalikannya. Tetapi begitu ia menjatuhkan output terminalnya exec 1>&2
(yang ditutup dengan subkulit yang sama dengan 2>&-
), proses lolos dan saya harus menunggu untuk itu di ujung yang lain. Agak yang terbaik dari kedua dunia, terutama jika Anda menggunakannya untuk menangani pipa input, selama Anda dapat membungkus pikiran Anda di sekitar semua pengalihan dan pemimpin proses.
Yang lainnya hanya untuk demonstrasi di sini. Yang Anda butuhkan untuk menjalankan ini adalah skrip teratas dan:
info="$(($script_path &)2>&- &)"
CATATAN: Ini hanya mencetak ke terminal persis apa yang ingin saya tunjukkan. Sebagaimana dicatat oleh$PPID,
proses ini tidak diakui oleh terminal dan merupakan anak langsung dari$PID 1.
Jika Anda ingin menjalankan keduanya secara bersamaan dan menunggu mereka, Anda bisa menyerahkan ps
keduanya dan menunggu.