Saya ingin menjalankan dua perintah secara bersamaan di bash pada mesin Linux. Karenanya dalam ./execute.sh
skrip bash saya, saya meletakkan:
command 1 & command 2
echo "done"
Namun ketika saya ingin menghentikan skrip bash dan menekan Ctrl+ C, hanya perintah kedua yang dihentikan. Perintah pertama terus berjalan. Bagaimana cara memastikan bahwa skrip bash lengkap dihentikan? Atau bagaimana pun, bagaimana cara menghentikan kedua perintah? Karena dalam kasus ini tidak peduli seberapa sering saya menekan Ctrl+ Cperintah tetap berjalan dan saya terpaksa menutup terminal.
Jawaban:
Jika Anda mengetik
ini sama dengan
yaitu ini akan menjalankan perintah pertama di latar belakang dan kemudian menjalankan perintah kedua di latar depan. Terutama ini berarti, bahwa Anda
echo "done"
dicetak setelahcommand 2
selesai walaupuncommand 1
masih berjalan.Anda mungkin mau
Ini akan menjalankan kedua perintah di latar belakang dan menunggu keduanya selesai.
Jika Anda menekan CTRL-C ini hanya akan mengirim sinyal SIGINT ke proses latar depan, yaitu
command 2
di versi Anda atauwait
di versi saya.Saya sarankan memasang perangkap seperti ini:
Dengan jebakan, sinyal SIGINT yang dihasilkan oleh CTRL-C terperangkap dan diganti oleh
killgroup
fungsinya, yang membunuh semua proses itu.sumber
set -x
di awal skrip untuk mencetak perintah yang dieksekusi.Saat meletakkan perintah ke latar belakang dari skrip, PID tidak ditampilkan di layar. Anda bisa menggunakan variabel builtin
$!
yang menyimpan PID dari proses terakhir sehingga Anda bisa menangkap PID dari command1.akan mengulang PID dari command1.
Bash juga menyediakan perangkap bawaan yang dapat Anda gunakan untuk mendaftarkan urutan perintah yang harus dijalankan ketika sinyal tertentu diterima. Anda dapat menggunakan ini untuk menangkap SIGINT dan membunuh command1 sebelum keluar dari skrip utama mis
Sekarang, ketika perintah 2 sedang berjalan, memukul Ctrl Cakan menyebabkan command1 dan command2 dikirim SIGINT.
sumber
%n
sintaks untuk mematikan pekerjaan latar belakang tertentu di shell ini. Biasanya Anda mengeluarkankill %1
untuk membunuh proses latar belakang terbaru dan satu-satunya. Dengan lebih banyak proses latar belakang, gunakanjobs
untuk melihat daftar terlebih dahulu.Versi GNU Paralel yang lebih baru akan melakukan apa yang Anda inginkan:
Atau jika
command
tetap sama:Tonton video intro untuk perkenalan cepat: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Berjalan melalui tutorial (man parallel_tutorial). Anda perintah baris dengan mencintaimu karenanya.
sumber
Ctrl+ Cmengirimkan sinyal SIGINT ke proses depan Anda, yaitu
command2
.command1
dijalankan di latar belakang, oleh karena itu tidak peduli dengan aliran input.Saat Anda mengetik
command1 &
, bash seharusnya memberi Anda proses 'PID, kira-kira seperti itu[1234]
. Untuk mematikan proses ini, Anda dapat menggunakankill 1234
. Sekarang, jika Anda memiliki PID keduanyacommand1
dancommand2
(lihatps -ef
), Anda dapat menggunakannyakill
untuk mengakhiri semuanya:Trik kecil adalah menjalankan kedua perintah di latar belakang, dengan:
Bash akan memberikan Anda kedua PID, siap untuk terbunuh. Trik lain adalah membawa kembali
command1
di latar depan setelah Anda membunuhcommand2
:Info lebih lanjut tersedia di sini: http://linuxg.net/how-to-manage-background-and-foreground-processes/
sumber