GNU/Linux >> Belajar Linux >  >> Linux

Cegah Sigint Mencapai Proses Anak?

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:

  1. Mengapa ini menyebabkan skrip hang?
  2. Bagaimana saya bisa mencegah SIGINT mencapai scp dan ssh 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"

Linux
  1. Mencegah skrip bash berjalan secara bersamaan

  2. Ssh – Skrip Untuk Mengotomatiskan Scp Dalam Jaringan?

  3. Cegah Tmux Memulai Di Ssh?

  1. Cegah Layar Gnu Dari Mengakhiri Sesi Setelah Script yang Dieksekusi Berakhir?

  2. Dari Mana Skrip Shell Dijalankan?

  3. Cegah ssh agar tidak memecah parameter skrip Shell

  1. Proses anak menerima SIGINT orang tua

  2. MYSQL berbeda dalam Keluaran dari skrip

  3. Cara mendapatkan PID dari proses anak bercabang di skrip Shell