Saya ingin menjalankan beberapa perintah (proses) pada satu shell. Semuanya memiliki output berkelanjutan sendiri dan tidak berhenti. Menjalankan mereka di istirahat latar belakang Ctrl- C. Saya ingin menjalankannya sebagai satu proses (subkulit, mungkin?) Untuk dapat menghentikan semuanya Ctrl- C.
Untuk lebih spesifik, saya ingin menjalankan tes unit dengan mocha
(mode menonton), menjalankan server dan menjalankan beberapa preprocessing file (mode menonton) dan melihat output masing-masing dalam satu jendela terminal. Pada dasarnya saya ingin menghindari menggunakan beberapa task runner.
Saya dapat menyadarinya dengan menjalankan proses di latar belakang ( &
), tetapi kemudian saya harus meletakkannya di latar depan untuk menghentikannya. Saya ingin memiliki proses untuk membungkus mereka dan ketika saya menghentikan proses itu menghentikan 'anak-anaknya'.
sumber
Jawaban:
Untuk menjalankan perintah secara bersamaan, Anda dapat menggunakan
&
pemisah perintah.Ini akan mulai
command1
, lalu jalankan di latar belakang. Sama dengancommand2
. Kemudian itu dimulai secaracommand3
normal.Output dari semua perintah akan kacau, tetapi jika itu bukan masalah bagi Anda, itu akan menjadi solusinya.
Jika Anda ingin memiliki tampilan terpisah pada output nanti, Anda dapat menyalurkan output dari setiap perintah
tee
, yang memungkinkan Anda menentukan file untuk mencerminkan output.Outputnya mungkin akan sangat berantakan. Untuk mengatasinya, Anda bisa memberikan output dari setiap perintah menggunakan awalan
sed
.Jadi jika kita menyatukan semua itu kita dapatkan:
Ini adalah versi yang sangat ideal tentang apa yang mungkin akan Anda lihat. Tapi itu yang terbaik yang bisa saya pikirkan saat ini.
Jika Anda ingin menghentikan semuanya sekaligus, Anda dapat menggunakan build in
trap
.Ini akan mengeksekusi
command1
dancommand2
di latar belakang dancommand3
di latar depan, yang memungkinkan Anda membunuhnya dengan Ctrl+ C.Ketika Anda membunuh proses terakhir dengan Ctrl+ Cyang
kill %1; kill %2
perintah dijalankan, karena kita terhubung eksekusi mereka dengan penerimaan dari interupsi sinyal, hal yang dikirim dengan menekan Ctrl+ C.Mereka masing-masing membunuh proses latar belakang 1 dan 2 (Anda
command1
dancommand2
). Jangan lupa untuk menghapus jebakan, setelah Anda selesai dengan perintah Anda menggunakantrap - SIGINT
.Monster perintah yang lengkap:
Anda tentu saja dapat melihat layar . Ini memungkinkan Anda membagi konsol Anda menjadi konsol terpisah sebanyak yang Anda inginkan. Jadi Anda dapat memonitor semua perintah secara terpisah, tetapi pada saat yang sama.
sumber
Anda dapat dengan mudah membunuh banyak proses sekaligus jika Anda mengatur untuk menjalankannya (dan hanya mereka) dalam grup proses yang sama .
Linux menyediakan utilitas
setsid
untuk menjalankan program dalam grup proses baru (bahkan dalam sesi baru, tetapi kami tidak peduli tentang itu). (Ini bisa dilakukan tetapi lebih rumit tanpasetsid
.)ID grup proses (PGID) grup proses adalah ID proses dari proses induk asli dalam grup. Untuk membunuh semua proses dalam grup proses, berikan negatif PGID ke
kill
panggilan sistem atau perintah. PGID tetap valid bahkan jika proses asli dengan PID ini mati (meskipun bisa sedikit membingungkan).Jika Anda menjalankan proses di latar belakang dari shell non-interaktif , maka mereka semua akan tetap berada di grup proses shell. Hanya di shell interaktif yang proses latar belakang berjalan di grup proses mereka sendiri. Karenanya, jika Anda melakukan fork perintah dari shell non-interaktif yang tetap berada di latar depan, Ctrl+ Cakan membunuh semuanya. Gunakan
wait
builtin untuk membuat shell menunggu semua perintah untuk keluar.sumber
Saya terkejut ini belum datang, tapi cara favorit saya untuk melakukan ini adalah dengan menggunakan subshell dengan perintah latar belakang. Pemakaian:
(command1 & command2 & command3)
Output terlihat dari keduanya, semua perintah bash dan kenyamanan masih tersedia, dan satu Ctrl-cmembunuh semuanya. Saya biasanya menggunakan ini untuk memulai server file klien live-debugging dan server backend pada saat yang sama, jadi saya bisa membunuh mereka berdua dengan mudah ketika saya mau.
Cara kerjanya adalah itu
command1
dancommand2
sedang berjalan di latar belakang instance subshell baru, dancommand3
berada di latar depan instance itu, dan subshell tersebut adalah yang pertama kali menerima sinyal kill dari Ctrl-cpenekanan tombol. Ini sangat mirip dengan menjalankan skrip bash sehubungan dengan siapa yang memiliki proses apa dan kapan program latar belakang terbunuh.sumber
wait
sebagai perintah terakhir (command3 dalam contoh Anda), Anda dapat menjalankan kode pembersihan setelah pengguna menekan Ctrl-c.Anda dapat menggunakan titik koma
;
atau&&
seperti ini:sumber
Anda bisa menggunakan a
pipe
. Ini akan memulai perintah di kedua ujung pipa secara bersamaan. Anda harus dapat menghentikan semua perintah denganCTRL-C
terlalu.1st command | 2nd command | 3rd command
Jika Anda ingin menjalankan perintah satu demi satu, Anda dapat menggunakan metode @ serenesat.
sumber