GNU/Linux >> Znalost Linux >  >> Linux

Jak zkontrolovat, jaké signály proces poslouchá?

Jak mohu ověřit, zda běžící proces zachytí signál, nebo jej ignoruje nebo zablokuje? V ideálním případě bych rád viděl seznam signálů, nebo alespoň nemusel signál skutečně posílat ke kontrole.

Přijatá odpověď:

V systému Linux můžete najít PID svého procesu a poté se podívat na /proc/$PID/status . Obsahuje řádky popisující, které signály jsou blokovány (SigBlk), ignorovány (SigIgn) nebo zachyceny (SigCgt).

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

Číslo vpravo je bitová maska. Pokud jej převedete z hexadecimální na binární, každý 1 bit představuje zachycený signál, počítá se zprava doleva počínaje 1. Interpretací řádku SigCgt tedy můžeme vidět, že můj init proces zachycuje následující signály:

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

(Mapování čísla na jméno jsem našel spuštěním kill -l z bash.)

UPRAVIT :A podle populární poptávky skript v 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. Jak otestovat, jaký Shell používám v terminálu?

  2. Co způsobuje odesílání různých signálů?

  3. Jak zkontrolovat poslech / otevřené porty pomocí Netstat v systému Linux

  1. Co je nepřerušitelný proces?

  2. Jak zkontrolovat, jaké sdílené knihovny jsou načteny za běhu pro daný proces?

  3. Jak zjistím, který běžící proces používá javu?

  1. Jak zkontrolovat využití paměti procesu pomocí příkazu Linux pmap

  2. Co jsou nevyřízené signály?

  3. Jak zkontrolovat využití I/O disku na proces?