Saya punya (belum) lain wait
, &
, &&
pertanyaan aliran kontrol ..
Katakanlah saya memiliki skrip seperti ini di mana saya ingin melakukan sebanyak mungkin pekerjaan pada saat yang bersamaan:
# may take some hours
something InputA > IrrelevantA &
something InputB > IrrelevantB &
# may take an hour
(
somethingElse InputA > OutputA &
somethingElse InputB > OutputB &
)&& combine OutputA OutputB > Result
...morestuff
Pertanyaan 1: Dalam skrip, apakah combine
menunggu kedua somethingElse
proses selesai sementara kedua something
proses berlanjut?
Pertanyaan 2: Jika tidak - dan saya kira tidak - bagaimana saya bisa combine
menunggu hanya untuk kedua somethingElse
proses sementara something
proses di atas terus berjalan di latar belakang?
sumber
Apakah proses substitusi akan lebih efisien, terutama jika Anda tidak perlu menyimpan file
OutputA
danOutputB
, dan hanya peduliResult
? Apakah ini akan sangat menghemat waktu karena jika Anda memiliki I / O yang lambat dalam menulis ke disk, menyimpan fileOutputA
danOutputB
mungkin langkah membatasi tingkat?Substitusi proses memungkinkan Anda untuk menempatkan perintah di dalam
<(..here..)
alih-alih menyimpan output ke file, dan kemudian membacanya sebagai input dalam langkah "menggabungkan".Jika ingatan adalah batasan, dan ukuran
outputA
sertaoutputB
lebih dari apa yang dapat dipegang ingatan, akankah ia mengalahkan seluruh tujuan?Akankah
combine
menunggu sampai kedua proses selesai sebelum mulai berjalan?sumber
combine
akan mulai berjalan segera setelah keduasomethingElse
perintah telah dimulai, tetapi tidak apa-apa, karena<(…)
semuanya pipa; jadicombine
hanya akan dipaksa untuk menunggu data jikasomethingElse
prosesnya lebih cepat. Dan, karena itu pipa, ukuran bukan masalah. … (Lanjutan)somethingElse
proses - dan itu tidak sepenuhnya jelas apakah itu penting bagi penanya. Tetapi, juga, sebuah jawaban seharusnya tidak menanyakan pertanyaan seperti itu.Anda dapat menggunakan
wait
perintah:Anda dapat melihat garis "mulai" terjadi segera, dan "selesai" menunggu selama 10 detik.
sumber
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
Jalankan Demo
Keluaran:
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 danechoes
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 sayasleep.
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 dips
's kembali harus lebih kuat dalam hal apapun.Layak disebutkan, saya pikir, adalah bahwa proses ini sebenarnya pada awalnya dipanggil
$(command substitution)
danprintfs
saya yang$info
saya inginkan sehingga saya dapat secara efektif mengendalikannya. Tetapi begitu ia menjatuhkan output terminalnyaexec 1>&2
(yang ditutup dengan subkulit yang sama dengan2>&-
), 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:
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.sumber