GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Memeriksa Sinyal Apa yang Didengarkan oleh Proses?

Bagaimana saya bisa memverifikasi apakah proses yang berjalan akan menangkap sinyal, atau mengabaikannya, atau memblokirnya? Idealnya saya ingin melihat daftar sinyal, atau setidaknya tidak harus benar-benar mengirim sinyal untuk diperiksa.

Jawaban yang Diterima:

Di Linux, Anda dapat menemukan PID proses Anda, lalu lihat /proc/$PID/status . Ini berisi garis yang menjelaskan sinyal mana yang diblokir (SigBlk), diabaikan (SigIgn), atau ditangkap (SigCgt).

# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...

Nomor di sebelah kanan adalah bitmask. Jika Anda mengubahnya dari hex ke biner, setiap 1-bit mewakili sinyal yang ditangkap, dihitung dari kanan ke kiri dimulai dengan 1. Jadi dengan menafsirkan garis SigCgt, kita dapat melihat bahwa init saya proses menangkap sinyal berikut:

00000000280b2603 ==> 101000000010110010011000000011
                     | |       | ||  |  ||       |`->  1 = SIGHUP
                     | |       | ||  |  ||       `-->  2 = SIGINT
                     | |       | ||  |  |`----------> 10 = SIGUSR1
                     | |       | ||  |  `-----------> 11 = SIGSEGV
                     | |       | ||  `--------------> 14 = SIGALRM
                     | |       | |`-----------------> 17 = SIGCHLD
                     | |       | `------------------> 18 = SIGCONT
                     | |       `--------------------> 20 = SIGTSTP
                     | `----------------------------> 28 = SIGWINCH
                     `------------------------------> 30 = SIGPWR

(Saya menemukan pemetaan nomor-ke-nama dengan menjalankan kill -l dari bash.)

EDIT :Dan berdasarkan permintaan populer, sebuah skrip, dalam POSIX sh.

sigparse () {
    i=0
    # bits="$(printf "16i 2o %X p" "0x$1" | dc)" # variant for busybox
    bits="$(printf "ibase=16; obase=2; %X\n" "0x$1" | bc)"
    while [ -n "$bits" ] ; do
        i="$(expr "$i" + 1)"
        case "$bits" in
            *1) printf " %s(%s)" "$(kill -l "$i")" "$i" ;;
        esac
        bits="${bits%?}"
    done
}

grep "^Sig...:" "/proc/$1/status" | while read a b ; do
        printf "%s%s\n" "$a" "$(sigparse "$b")"
    done # | fmt -t  # uncomment for pretty-printing

Linux
  1. Apa Proses Zombie Dan Bagaimana Menemukan &Membunuh Proses Zombie?

  2. Bagaimana Menguji Shell Apa yang Saya Gunakan Di Terminal?

  3. Apa Penyebab Berbagai Sinyal Terkirim?

  1. Cara Memeriksa Mendengarkan / Membuka Port dengan Netstat di Linux

  2. Bagaimana cara memeriksa pustaka bersama apa yang dimuat saat dijalankan untuk proses tertentu?

  3. Cara memeriksa ukuran heap untuk suatu proses di Linux

  1. Cara Memeriksa Versi CentOS

  2. Bagaimana cara menentukan proses berjalan apa yang menggunakan java?

  3. Apa itu sinyal tertunda?