Diberikan loop ini:
while sleep 10s ; do
something-that-runs-forever
done
Ketika saya menekan Ctrl + C seluruh loop sementara terputus. Yang ingin saya lakukan adalah menghentikan proses "sesuatu", biarkan 10 detik berlalu, dan kemudian mulai kembali "sesuatu".
Bagaimana cara membuat ctrl + c hanya memengaruhi "sesuatu", dan bukan loop-sementara?
Sunting: "interupsi" seperti pada SIGINT. Membunuh. Menggugurkan. Mengakhiri. Bukan "interupsi" seperti pada "jeda".
fg
? Mengapa menggunakan Ctrl + C?What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something"
. Jika Anda menekan Ctrl + Z, tunggu 10s dan kemudian jalankanfg
, itulah yang akan terjadi. Mungkin Anda bisa mengedit pertanyaan Anda dan memberikan contoh spesifik sehingga kami dapat memahami dengan lebih baik?Jawaban:
Ini harus bekerja jika Anda hanya
trap
SIGINT
melakukan sesuatu. Suka:
(true
).Mengganggu
something...
tidak membuat shell keluar sekarang, karena mengabaikan sinyal. Namun, jika Anda ^ Csleep
proses, itu akan keluar dengan kegagalan, dan loop berhenti karena itu. Pindahkansleep
ke bagian dalam loop atau tambahkan sesuatu seperti|| true
untuk mencegahnya.Perhatikan bahwa jika Anda menggunakan
trap "" INT
untuk mengabaikan sinyal sepenuhnya (alih-alih menetapkan perintah untuk itu), itu juga diabaikan dalam proses anak, jadi Anda juga tidak dapat menyelasomething...
. Ini secara eksplisit disebutkan dalam setidaknya manual Bash :sumber
do (trap - INT; something-that-runs-forever)
mengizinkan interupsi dari perintah. Juga, Anda tidak perlu run:
- Anda hanya dapat menggunakan string kosong untuk mengabaikan sinyal:trap '' INT
. Semua ini POSIX, dan harus bekerja pada shell yang sesuai (bukan hanya Bash).SIGINT
secara penuh tidak sepenuhnya portabel: " Implementasi dapat mengizinkan nama denganSIG
awalan atau mengabaikan huruf dalam nama sinyal sebagai ekstensi . " (Penekanan saya)trap "" INT
(juga posix)trap :
bukannyatrap ""
tepatnya itu, untuk tidak mengabaikan sinyal (tetapi menjadikannya sebagai no-op sebagai gantinya), sehingga kita tidak perlu melakukan hal lain untuk dapat mengganggusomething
program utama .Pilihan lain adalah
something-that-runs-forever
menangani sinyal (keluar dengan anggun saat diterima). Tentu saja, itu hanya masuk akal untuk dilakukan ketika program ini digunakan dalam banyak skrip, dan perilaku yang diinginkan pada CTRL+ Csecara sistematis sama - untuk melanjutkan eksekusi skrip.sumber