Saya mencoba menulis file .sh yang menjalankan banyak program secara bersamaan
Saya mencoba ini
prog1
prog2
Tapi itu menjalankan prog1 lalu menunggu sampai prog1 berakhir dan kemudian mulai prog2 ...
Jadi bagaimana saya bisa menjalankannya secara paralel?
bash
parallel-processing
Betamoo
sumber
sumber
wait
! Ya, dalam bash Anda bisa menunggu proses anak skrip.nohup
untuk mencegah program tidak terbunuh ketika shell menutup.Bagaimana tentang:
Ini akan:
prog1
.prog2
, dan simpan di latar depan , sehingga Anda bisa menutupnyactrl-c
.prog2
, Anda akan kembali keprog1
's latar depan , sehingga Anda dapat juga dekat denganctrl-c
.sumber
prog1
ketikaprog2
berakhir? Pikirkannode srv.js & cucumberjs
prog1 & prog2 ; fg
Ini untuk menjalankan beberapa ssh tunnel sekaligus. Semoga ini bisa membantu seseorang.prog2
gagal dijalankan segera, Anda akan kembali keprog1
latar depan. Jika ini diinginkan, maka tidak apa-apa.prog1 & prog2 && kill $!
.Anda bisa menggunakan
wait
:Ini menetapkan PID program latar belakang ke variabel (
$!
adalah proses PID yang terakhir diluncurkan), kemudianwait
perintah menunggu mereka. Itu bagus karena jika Anda membunuh skrip, itu membunuh proses juga!sumber
#!/usr/bin/env bash ARRAY='cat bat rat' for ARR in $ARRAY do ./run_script1 $ARR & done P1=$! wait $P1 echo "INFO: Execution of all background processes in the for loop has completed.."
${}
untuk menyisipkannya ke dalam daftar string atau sejenisnya.Dengan GNU Parallel http://www.gnu.org/software/parallel/ semudah:
Atau jika Anda lebih suka:
Belajarlah lagi:
sumber
parallel
dengan sintaks yang berbeda. Sebagai contoh, pada turunan Debianmoreutils
paket berisi perintah berbeda yang disebutparallel
berperilaku sangat berbeda.parallel
lebih baik daripada menggunakan&
?parallel
lebih baik ketika ada lebih banyak pekerjaan daripada inti, dalam hal ini&
akan menjalankan lebih dari satu pekerjaan per inti sekaligus. (lih prinsip pigeonhole )Jika Anda ingin dapat dengan mudah menjalankan dan membunuh beberapa proses
ctrl-c
, ini adalah metode favorit saya: menelurkan banyak proses latar belakang dalam sebuah(…)
subkulit, dan perangkapSIGINT
untuk dieksekusikill 0
, yang akan membunuh semua yang dihasilkan dalam grup subkulit:Anda dapat memiliki struktur eksekusi proses yang kompleks, dan semuanya akan ditutup dengan satu
ctrl-c
(pastikan saja proses terakhir dijalankan di latar depan, yaitu, jangan menyertakan&
afterprog1.3
):sumber
xargs -P <n>
memungkinkan Anda untuk menjalankan<n>
perintah secara paralel.Meskipun
-P
merupakan opsi yang tidak standar, baik implementasi GNU (Linux) dan macOS / BSD mendukungnya.Contoh berikut:
Outputnya terlihat seperti:
Waktu menunjukkan bahwa perintah dijalankan secara paralel (perintah terakhir diluncurkan hanya setelah yang pertama dari 3 asli dihentikan, tetapi dieksekusi sangat cepat).
The
xargs
perintah itu sendiri tidak akan kembali sampai semua perintah telah selesai, tetapi Anda dapat jalankan di latar belakang dengan mengakhiri itu dengan operator kontrol&
dan kemudian menggunakanwait
builtin untuk menunggu seluruhxargs
perintah untuk menyelesaikan.catatan:
BSD / macOS
xargs
mengharuskan Anda untuk menentukan jumlah perintah untuk dijalankan secara paralel secara eksplisit , sedangkan GNUxargs
memungkinkan Anda menentukan-P 0
untuk menjalankan sebanyak mungkin secara paralel.Output dari proses yang berjalan secara paralel tiba saat sedang dihasilkan , sehingga akan disisipkan secara tak terduga .
parallel
, sebagaimana disebutkan dalam jawaban Ole ( tidak datang standar dengan sebagian besar platform), dengan mudah membuat serialisasi (mengelompokkan) output berdasarkan per proses dan menawarkan banyak fitur yang lebih canggih.sumber
Arahkan ulang kesalahan ke log yang terpisah.
sumber
prog1 2> .errorprog1.log & prog2 2> .errorprog2.log &
ls notthere1 & 2> .errorprog1.log; ls notthere2 & 2>.errorprog2.log
. Kesalahan masuk ke konsol, dan kedua file kesalahan kosong. Seperti yang dikatakan @Dennis Williamson,&
adalah pemisah, seperti;
, jadi (a) ia harus pergi di akhir perintah (setelah redirecton), dan (b) Anda tidak memerlukan;
sama sekali :-)Ada program yang sangat berguna yang memanggil nohup.
sumber
nohup
dengan sendirinya tidak menjalankan apa pun di latar belakang, dan menggunakannohup
bukanlah persyaratan atau prasyarat untuk menjalankan tugas di latar belakang. Mereka sering berguna bersama tetapi dengan demikian, ini tidak menjawab pertanyaan.Berikut adalah fungsi yang saya gunakan untuk menjalankan proses max n secara paralel (n = 4 pada contoh):
Jika max_children diatur ke jumlah core, fungsi ini akan mencoba untuk menghindari core idle.
sumber
wait -n
membutuhkanbash
4.3+ dan perubahan logika untuk menunggu setiap proses yang ditentukan / tersirat untuk mengakhiri.Anda dapat mencoba pps . ppss agak kuat - Anda bahkan dapat membuat cluster mini. xargs -P juga dapat berguna jika Anda memiliki banyak pemrosesan paralel yang memalukan untuk dilakukan.
sumber
Saya memiliki situasi yang sama baru-baru ini di mana saya perlu menjalankan beberapa program pada saat yang sama, mengarahkan output mereka ke file log yang terpisah dan menunggu mereka selesai dan saya berakhir dengan sesuatu seperti itu:
Sumber: http://joaoperibeiro.com/execute-multiple-programs-and-redirect-their-outputs-linux/
sumber
Manajer Pemijahan Proses
Tentu, secara teknis ini adalah proses, dan program ini harus benar-benar disebut sebagai proses pemijahan manajer, tetapi ini hanya karena cara BASH bekerja ketika garpu menggunakan ampersand, menggunakan fork () atau mungkin clone () system call yang mengkloning ke ruang memori yang terpisah, daripada sesuatu seperti pthread_create () yang akan berbagi memori. Jika BASH mendukung yang terakhir, setiap "urutan eksekusi" akan beroperasi dengan cara yang sama dan dapat disebut sebagai utas tradisional sekaligus mendapatkan jejak memori yang lebih efisien. Namun secara fungsional kerjanya sama, meskipun sedikit lebih sulit karena variabel GLOBAL tidak tersedia di setiap klon pekerja sehingga penggunaan file komunikasi antar-proses dan semafor kawanan rudimenter untuk mengelola bagian-bagian penting. Mencabuti dari BASH tentu saja merupakan jawaban dasar di sini, tetapi saya merasa seolah-olah orang tahu itu, tetapi benar-benar mencari untuk mengelola apa yang dilahirkan daripada hanya bercabang dan melupakannya. Ini menunjukkan cara untuk mengelola hingga 200 contoh proses bercabang semua yang mengakses satu sumber daya. Jelas ini berlebihan tapi saya senang menulisnya jadi saya teruskan. Tingkatkan ukuran terminal Anda sesuai. Saya harap Anda menemukan ini berguna.
sumber
Script Anda akan terlihat seperti:
Dengan asumsi sistem Anda dapat mengambil pekerjaan sekaligus. gunakan tunggu untuk menjalankan hanya n pekerjaan sekaligus.
sumber
Dengan bashj ( https://sourceforge.net/projects/bashj/ ), Anda harus dapat menjalankan tidak hanya beberapa proses (seperti yang disarankan orang lain) tetapi juga beberapa Thread dalam satu JVM yang dikendalikan dari skrip Anda. Tapi tentu saja ini membutuhkan java JDK. Thread mengkonsumsi sumber daya lebih sedikit daripada proses.
Ini adalah kode yang berfungsi:
sumber