Di Linux, Anda dapat menemukan PID proses Anda, lalu lihat /proc/$PID/status
. Ini berisi garis yang menggambarkan sinyal mana yang diblokir (SigBlk), diabaikan (SigIgn), atau ditangkap (SigCgt).
# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...
Angka di sebelah kanan adalah bitmask. Jika Anda mengonversinya dari hex ke biner, setiap 1-bit mewakili sinyal yang ditangkap, dihitung dari kanan ke kiri mulai dari 1. Jadi dengan menginterpretasikan garis SigCgt, kita dapat melihat bahwa init
proses saya 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 angka-ke-nama dengan menjalankan kill -l
dari bash.)
EDIT : Dan dengan permintaan populer, 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
SigBlk
apakah itu juga munculSigCgt
? Karena dengan memblokirnya, itu hanya berarti sinyal akan dikirim kembali sedikit kemudian, dan perlu ditangkap?/proc
? Ini hanya akan bekerja di Linux ... Danlocal
bukan POSIX. Yah, memang agak, tapi efeknya "tidak ditentukan"./bin/sh
. Anda benar tentanglocal
; Saya akan membersihkannya.Di Solaris, jalankan
psig
id proses untuk mendapatkan daftar sinyal dan cara penanganannya.Misalnya:
yang menunjukkan bahwa SIGHUP, SIGILL, dll. semuanya akan ditangkap oleh fungsi pengendali sinyal yang sama
termsig_sighandler
, yang akan dijalankan tanpa menggunakan salah satu flag yang dapat diatur melaluisigaction
, dan semua sinyal yang akan ditutup sementara untuk sementara pengendali sinyal berjalan (dalam hal ini semua yang menggunakan penangan sinyal yang sama, sehingga tidak dimasukkan kembali saat sudah berjalan). Anda juga dapat melihat bahwa SIGQUIT & SIGTERM akan diabaikan, SIGKILL & SIGPWR menggunakan aksi sinyal standar sistem, dan SIGCLD menentukan flag RESTART, jadi jika pengendali sinyal menginterupsi panggilan sistem, syscall akan dimulai kembali.sumber
(Jawaban ini mirip dengan jawaban @ user18096, karena ia membuat skrip di sekitar jawaban @ Jander.)
Saya telah menulis
psig script
untuk mengambil PID (atau semua PID) dan membuat output yang dapat dibaca manusia dari masker sinyal/proc/<PID>/status
.Contoh output:
Peringatan:
with
danOrderedDict
.sumber
Saya terus kembali ke @ Jander's jawaban cantik berharap untuk decoder copy-and-paste ketika dihadapkan dengan seperti:
Kira saya harus mengetuk sesuatu ... katakan:
Saya ingin itu agak terbaca, tapi itu membuatnya lebih mudah untuk diminta daripada yang saya inginkan, jadi, berkat saran @ alanc, saya akan menyimpannya sebagai ~ / bin / psig.
sumber
Menggunakan
ini(tautan rusak) perpustakaan ini untuk mendapatkan info tentang pekerjaan yang sedang berjalan.Ada bidang khusus
struct Job
untuk sinyal, yang disebutsigCgt
Anda dapat menggunakan sesuatu seperti ini:
sumber
Pada FreeBSD, gunakan
procstat -i <PID>
untuk melihat sinyal mana yang diabaikan oleh proses. Demikian pula,procstat -j <PID>
untuk melihat sinyal mana yang diblokir oleh utas proses. Kedua perintah menunjukkan jika sinyal tertunda.Output sampel:
$ procstat -i 38540 PID COMM SIG FLAGS 38540 nsulfd HUP -I- 38540 nsulfd INT -I- 38540 nsulfd QUIT -I- 38540 nsulfd ILL --- 38540 nsulfd TRAP --- ...
$ procstat -j 38540 PID TID COMM SIG FLAGS 38540 101220 nsulfd HUP -- 38540 101220 nsulfd INT -- 38540 101220 nsulfd QUIT -B 38540 101220 nsulfd ILL -- 38540 101220 nsulfd TRAP -- ...
Lihat procstat (1) .
sumber