Jalankan dua atau lebih perintah secara bersamaan dalam skrip shell

Nov 28 2020

Seringkali sangat membantu untuk menjalankan perintah secara paralel dalam skrip shell, tetapi saya tidak dapat menemukan cara untuk melakukannya. Apakah ini mungkin? Jika demikian, bagaimana saya mencapai itu? Saya terutama tertarik melakukan itu untuk fish.

Ini berguna ketika saya menjalankan perintah yang membutuhkan waktu lama untuk diselesaikan tetapi dapat atau perlu dijalankan pada waktu yang sama untuk mengurangi waktu yang dibutuhkan untuk menyelesaikan semuanya.

Jawaban

5 KamilMaciorowski Nov 28 2020 at 16:03

Pendekatan paling dasar adalah dengan &, jawaban lain ini benar. Itu juga menganjurkan nohuptetapi nohupmengalihkan stdin, stdout dan stderr, sesuatu yang Anda mungkin atau mungkin tidak inginkan. Baca Perbedaan antara nohup, disowndan& dan buat keputusan yang cerdas.

Pendekatan lainnya adalah parallel. Ini akan berguna jika perintah yang ingin Anda paralelkan serupa satu sama lain dan Anda dapat membuat pola.

Varian dasar alat (dari moreutils, setidaknya di Debian ) memungkinkan Anda membatasi jumlah pekerjaan yang dijalankan pada waktu yang sama. GNUparallel lebih maju. Jika pekerjaan yang ingin Anda jalankan menghasilkan keluaran, maka opsi berikut akan sangat berguna:

--group
Keluaran grup. Output dari setiap pekerjaan dikelompokkan menjadi satu dan hanya dicetak saat perintah selesai. Stdout (keluaran standar) terlebih dahulu diikuti oleh stderr (kesalahan standar). […]

( sumber )

( --groupdiaktifkan secara default, jadi biasanya Anda tidak perlu menggunakannya secara eksplisit.)

--keep-order
-k
Pertahankan urutan keluaran sama dengan urutan masukan. Biasanya, hasil pekerjaan akan dicetak segera setelah pekerjaan selesai. […] -kHanya mempengaruhi urutan keluaran dicetak - bukan urutan pelaksanaan pekerjaan.

( sumber )

Dengan mereka, keluaran dari berbagai pekerjaan akan diatur, sesuatu yang tidak dapat Anda peroleh &. Kadang-kadang Anda mungkin tidak peduli tentang keluaran tetapi masih peduli dengan urutan; seperti dalam jawaban saya ini di mana GNU paralleldigunakan untuk memparalelkan banyak curlproses dan mendapatkan status keluar dari masing-masing, mempertahankan urutannya.

Di Debian GNU parallelada dalam sebuah paket bernama parallel. Sebagai executable terpisah paralleldapat dijalankan dari shell manapun.

2 Giacomo1968 Nov 28 2020 at 11:12

Cara terbaik untuk melakukan ini adalah dengan menggabungkan nohupprefacing perintah dengan &ditambahkan ke akhir perintah

Belum jelas apa tujuan inti Anda, tapi saya harap bantuannya!

Untuk menjalankan perintah apa pun sebagai proses latar belakang pada mesin Linux, Anda harus menambahkan perintah dengan nohupdan menambahkan &di akhir.

Jadi perintah terakhirnya adalah:

nohup [your command] &

The nohupberarti perintah harus mengabaikan “hang up” dan ampersand &ditambahkan untuk itu adalah perintah shell yang memberitahu sistem untuk menjalankan perintah sebagai proses latar belakang. Informasi lebih lanjut tentang penggunaannya dapat ditemukan di sini .

Ketika Anda menjalankan perintah seperti ini, proses akan berjalan, Anda akan dikirim kembali ke prompt perintah dan Anda dapat keluar dari sesi terminal atau bahkan pergi dan melakukan hal lain yang tidak berhubungan dengan perintah itu selama sesi terminal itu.