Misalkan saya memiliki tiga (atau lebih) script bash: script1.sh
, script2.sh
, dan script3.sh
. Saya ingin memanggil ketiga skrip ini dan menjalankannya secara paralel . Salah satu cara untuk melakukan ini adalah dengan hanya menjalankan perintah berikut:
nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &
(Secara umum, skrip mungkin membutuhkan beberapa jam atau hari untuk menyelesaikannya, jadi saya ingin menggunakannya nohup
agar terus berjalan meskipun konsol saya ditutup.)
Tetapi, adakah cara untuk menjalankan ketiga perintah itu secara paralel dengan satu panggilan?
Saya sedang memikirkan sesuatu seperti
nohup bash script{1..3}.sh &
tapi ini muncul untuk mengeksekusi script1.sh
, script2.sh
dan script3.sh
secara berurutan, tidak secara paralel.
nohup bash script{1..100}.sh &
ataufor i in {1..100}; do nohup bash script{1..100} &; done
), daripada mengetiknohup bash script*.sh &
100 kali yang berbeda.screen
juga (atautmux
), untuk menyelesaikan masalah konsol tetapi tetap mengakses output (dan input).nohup ... & nohup ... & nohup ... &
. Jika Anda bermaksud mengatakan bahwa Anda ingin menjalankan semua skrip tanpa mengetik setiap nama skrip secara terpisah, sebuah loop sederhana akan melakukannya.Jawaban:
sumber
Cara yang lebih baik adalah dengan menggunakan GNU Parallel . Paralel GNU sederhana dan dengan itu kita dapat mengontrol jumlah pekerjaan yang dijalankan secara paralel dengan lebih banyak kontrol atas pekerjaan.
Dalam perintah di bawah ini,
script{1..3}.sh
diperluas dan dikirim sebagai argumenbash
secara paralel. Di sini-j0
menunjukkan bahwa sebanyak mungkin pekerjaan harus dijalankan. Secara defaultparallel
menjalankan satu pekerjaan untuk satu inti cpu.Dan Anda juga dapat mencoba menggunakan
Saat menjalankan metode kedua jika Anda mendapatkan pesan kesalahan maka itu berarti bahwa
--tollef
opsi diatur/etc/parallel/config
dan yang perlu dihapus dan semuanya akan berfungsi dengan baik.Anda dapat membaca
GNU Parallels
halaman manual di sini untuk opsi yang lebih kaya.Dan jika Anda menjalankan pekerjaan dari mesin jarak jauh, lebih baik gunakan
screen
agar sesi tidak ditutup karena masalah jaringan.nohup
tidak perlu, seperti versi terbaru dari bash sebagai datang denganhuponexit
sebagaioff
dan ini akan mencegah orang tua shell mengirimkanHUP
sinyal kepada anak-anak selama keluarnya. Dalam kasus jika tidak disetel lakukan dengansumber
bash
shell yangparallel -j0 bash :::: <(ls script{1..3}.sh)
dapat dikurangiparallel -j0 bash :::: script{1..3}.sh
, bukan?parallel -j0 bash ::: script{1..3}.sh
?bash ::: script{1..3}.sh
diteruskan keparallel
, bukan::: script{1..3}.sh
. Jadi ini pertama harus memperluas untukparallel bash ::: script1.sh script2.sh script3.sh
oleh shell dan kemudianparallel
doa daribash script1.sh
,bash script2.sh
,bash script3.sh
. Saya mencobanyaparallel -j0 bash ::: script{1..3}.sh
- ini lebih baik daripada::::
pendekatan karena menghindari kebutuhan untuk proses substitusi. Juga parsing ls output sarat dengan jebakanKita juga bisa menggunakan
xargs
untuk menjalankan banyak skrip secara paralel.di sini setiap skrip diteruskan ke bash sebagai argumen secara terpisah.
-P 0
menunjukkan bahwa jumlah proses paralel dapat sebanyak mungkin. Lebih aman menggunakan bash defaultjob control feature
(&)
.sumber
Solusi jalur tunggal :
Dengan kurang cerdik, cukup gunakan skrip wrapper:
Atau lewati mereka:
sumber
Jika Anda ingin menghemat usaha mengetik
Atau pada pikiran kedua, mungkin tidak
sumber
Lihat alat ini: https://github.com/wagoodman/bashful
Katakanlah Anda sudah
mytasks.yaml
bersamaDan Anda menjalankannya seperti ini:
Skrip Anda akan dijalankan secara paralel dengan bilah kemajuan vertikal (+ eta jika Anda sudah menjalankannya sebelumnya dan waktunya sudah pasti). Anda dapat mengubah berapa banyak tugas yang ingin Anda jalankan secara paralel jika Anda mulai menjalankan lebih dari 3 yang diberikan di sini:
Penafian: Saya penulis.
sumber
Saya menyarankan utilitas yang jauh lebih sederhana yang baru saja saya tulis. Saat ini disebut par, tetapi akan segera diganti nama menjadi parl atau pll, belum memutuskan.
https://github.com/k-bx/par
API sesederhana:
sumber
Gunakan paralelshell
https://github.com/keithamus/parallelshell
sumber