Misalkan saya memiliki lima .sh
skrip Bash ( ) dalam folder ( my_folder
), dan mereka diberi nama sebagai berikut:
script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh
Bagaimana saya bisa menulis skrip Bash keenam atau hanya satu liner yang akan mulai menjalankan semua skrip ini bersama-sama?
Saya membutuhkan lima skrip untuk mulai berjalan bersama pada saat yang sama dan tidak satu demi satu.
Jawaban:
GNU
parallel
sangat cocok untuk hal semacam ini. Instal dengansudo apt install parallel
dan kemudian:The
-j
mengontrol berapa banyak proses t dijalankan secara paralel, dan-j0
berarti "mereka semua". Setel ke nilai lain (misalnya-j20
) untuk menjalankan skrip dalam batch sebagai gantinya.sumber
parallel
perintah darimoreutils
paket. Contoh penggunaan:parallel -j 20 -- my_folder/*.sh
(Tidak seperti GNUparallel
,-j0
akan menjalankan skrip satu per satu).sudo apt install parallel
akan mengganti file/usr/bin/parallel
dengan yang dari paralel GNU. Jadi selama Anda menginstalnya, seperti jawaban saya menyarankan, itu harus berfungsi seperti yang diharapkan.parallel
perintah yang tidak berhasil dari manual saat menulis jawaban saya untuk menyarankan GNU paralel.Untuk menjalankan semua skrip pada saat yang sama (secara paralel) gunakan:
Untuk menjalankan yang satu setelah yang lain (secara berurutan) gunakan:
Peningkatan untuk komentar
Jika Anda memiliki 200 skrip yang ingin Anda jalankan pada saat yang sama (yang mungkin menghambat mesin BTW) gunakan skrip ini:
Atur atribut skrip menjadi executable dengan perintah:
Pertama kali Anda menjalankan skrip itu hanya akan menggemakan nama 200 skrip yang akan dieksekusi. Ketika Anda senang nama-nama yang tepat dipilih edit skrip dan ubah baris ini:
untuk:
Ada tiga cara Anda dapat memanggil skrip bash dari yang lain seperti dijawab di sini:
Dalam kasus OP, satu atau lebih dari 200 skrip tidak berisi
#!/bin/bash
baris pertama shebang dalam file. Dengan demikian, opsi 3. harus digunakan.200 Script berjalan pada saat bersamaan
Sebuah komentar telah diajukan tentang apakah mereka "berjalan pada saat yang sama". Pada sistem 8 CPU yang khas, 25 skrip akan berbagi satu CPU pada saat yang sama tetapi hanya satu skrip yang akan dieksekusi pada satu waktu sampai irisan waktu (diukur dalam milidetik) habis. Kemudian pekerjaan berikutnya akan menerima bagian yang adil dari milidetik, kemudian pekerjaan berikutnya, dll., Dll.
Secara longgar kita dapat mengatakan 200 pekerjaan berjalan "bersamaan" tetapi tidak "secara bersamaan" di 8 CPU yang setara dengan 25 pekerjaan per CPU:
Di atas gambar dan komentar di bawah ini dari penjadwal kernel Linux
sumber
bash
awalan untuk memanggil skrip.Ada alat untuk ini, baca
man run-parts
.Sebagai contoh, saya lakukan:
dalam skrip cadangan Palm Pilot saya.
${visorhome}/pbackup.d/
:sumber
run-parts
mengeksekusi skrip secara berurutan daripada sekaligus sebagai OP diminta. Namun, Anda benar bahwa menjalankan 200 skrip sekaligus tidak mungkin melakukan hal yang sama dengan menjalankan 5 - dan bahkan jika menjalankannya sekaligus tidak menyebabkan masalah, itu mungkin masih tidak perlu. Saya telah berkomentar untuk menyarankan OP mengklarifikasi preferensi mereka dalam hal ini.run-parts
tidak akan menjalankan skrip (mereka memiliki titik dalam nama:my_folder/*.sh
run-parts
memiliki persyaratan nama file yang sangat spesifik untuk beberapa alasan aneh. Itu tidak akan meluncurkan nama file dengan ekstensi, jadi saya khawatir ini tidak akan berfungsi di sini.Untuk menjalankan semua
*.sh
skrip dimy_folder
direktori pada saat yang sama menggunakanxargs
:Untuk membatasi jumlah skrip yang dieksekusi secara bersamaan menjadi
10
:sumber
ls
dalam skrip. Penggunaannyafind
jauh lebih aman. Ini item pertama di sini: mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29