Saya punya skrip berikut:
#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat # wait indefinitely
Ketika saya mengirim SIGHUP
(menggunakan kill -HUP pid
), tidak ada yang terjadi.
Jika saya mengubah sedikit skrip:
#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT # add this
trap "echo HUP" SIGHUP
cat # wait indefinitely
... lalu skrip melakukan echo HUP
hal yang benar saat keluar (ketika saya menekan Ctrl + C):
roger@roger-pc:~ $ ./hupper.sh
We are 6233
^CHUP
Apa yang sedang terjadi? Bagaimana saya harus mengirim sinyal (tidak harus SIGHUP
) ke skrip ini?
cat
proses selesai. Coba skrip asli Anda dan tekanCtrl+D
untuk membuatcat
proses keluar. Sementaracat
proses berada di latar depan,HUP
sinyal tidak ditindaklanjuti. Coba lagi dengancat
diganti olehread
(built-in shell).while true; do read; done
pada akhirnya, jika tidak memasukkan teks menyebabkannya berhenti juga, dan saya ingin itu berhenti pada Ctrl + C.Jawaban:
Manual Bash menyatakan:
Itu berarti bahwa meskipun sinyal diterima
bash
ketika Anda mengirimkannya, jebakan Anda pada SIGHUP hanya akan dipanggil saatcat
berakhir.Jika perilaku ini tidak diinginkan, maka gunakan
bash
builtin (misalread
+printf
dalam lingkaran alih-alihcat
) atau gunakan pekerjaan latar belakang (lihat jawaban Stéphane ).sumber
@xhienne telah menjelaskan alasannya , tetapi jika Anda ingin agar sinyal langsung bekerja (dan tidak keluar dari skrip), Anda dapat mengubah kode Anda menjadi:
Tarian kecil dengan deskriptor file adalah untuk mengatasi kenyataan bahwa
bash
pengalihan stdin ke/dev/null
untuk perintah diluncurkan di latar belakang.sumber