Saya memiliki skrip bash untuk menjalankan server, yang biasanya akan dihentikan oleh pengguna menggunakan Ctrl-C
. Saat keluar, ia menjalankan fungsi pembersihan, yang saya tidak ingin diganggu oleh Ctrl-C
kedua .
#!/bin/bash
...
function cleanup {
trap '' INT
echo -n " Cleaning up..."
scp $SRV:~/$DIR/server.log . && ssh -t $SRV "rm -rf ~/$DIR"
echo " Finished."
exit 0
}
trap cleanup EXIT
...
Saat ini, Ctrl-C
kedua sebelum scp
telah selesai menyebabkan skrip hang tanpa batas waktu. Saya mengerti ini ada hubungannya dengan SIGINT
sedang dikirim ke skrip bash dan scp
proses, tetapi saya bingung mengapa ini menyebabkan skrip hang, bukan hanya menyebabkan pembersihan gagal.
Jadi pertanyaan saya adalah:
- Mengapa ini menyebabkan skrip hang?
- Bagaimana saya bisa mencegah SIGINT mencapai
scp
danssh
proses anak?
Jawaban yang Diterima:
trap '' INT
dimaksudkan untuk mengabaikan SIGINT untuk shell dan semua turunannya.
Tapi melihat strace
output pada scp
, sepertinya scp
menginstal pengendali SIGINT sendiri yang membatalkan SIG_IGN di atas.
Satu-satunya cara untuk mencegahnya mendapatkan SIGINT adalah dengan menjalankannya di grup proses yang berbeda seperti dengan:
perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...
atau
(set -m; scp ... & wait)
atau beri tahu driver tty untuk berhenti mengirim SIGINT pada Ctrl-C (seperti dengan stty -isig
, atau stty intr ''
untuk ^C
sendiri), meskipun Anda ingin mengembalikan pengaturan setelahnya:
saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"