2016-08-16
How you tell what signals a Linux process is ignoring
Suppose that you want to know what processes on your system are
ignoring certain signals, such as the SIGTERM
that systemd uses
to try to get lingering processes to quit.
How do you find this out? As with many process-related things in Linux,
the answer is that you look in /proc
.
Specifically, you look in /proc/<pid>/status
and get the SigIgn:
field. This is in hex, and may look something like this:
SigIgn: 0000000000004007
(There is also SigCgt:
for the signals that the process has
installed signal handlers for.)
This is a bitmap of signals. You can see the mapping between signal
names and numbers with 'kill -L
' (which reports them in decimal),
and then use your favorite decimal+hex calculator to work out what
bit this corresponds to. Suppose we want SIGTERM
, signal 15.
I'm a Python person, so:
$ python -c 'print "%x" % (1<<(15-1))' 4000
(We subtract one because signals are numbered starting from 1 instead of 0.)
In this case, the question about our SigIgn:
above is very easy;
this process is ignoring SIGTERM
, but not any other signals around
it.
If we want to look at a mass of processes, we can abuse gawk
:
cd /proc gawk '/^SigIgn:/ && (and(strtonum("0x" $2), 0x4000) > 0) {print FILENAME}' */status
Somewhat to my surprise, it turns out that there are quite a few
programs on my Linux machine that are ignoring SIGTERM
. But how
many are ignoring both SIGTERM
and SIGHUP
(signal 1, and thus
it has the mask 0x01)?
cd /proc gawk '/^SigIgn:/ && (and(strtonum("0x" $2), 0x4001) == 0x4001) {print FILENAME}' */status
Once again there were more than I expected. However, I think I don't
notice most of them because they exit if their connection to the X
server goes away. The exception is my non-friend
kio_http_cache_cleaner
, which is apparently so disconnected
from everything that it doesn't notice my X session disappearing.
(Perhaps it would if I was running a proper KDE session, or even a Gnome session. Also, now I wonder if I am somehow indirectly starting it in such a way that it ignores more signals than usual, since a number of things in my X session turn out to have the same set of ignored signals as it does.)
Sidebar: seeing what signals a Linux process is ignoring
On some systems, such as Solaris and its descendents, you have a
handy psig
program that will report all sorts of information about
what signals a process is ignoring or catching and what it's doing
with them and so on. On Linux, as far as I know, even a basic version
is not part of eg procps-ng
or similar packages. If you need this
information, see eg Erik Weathers' psig
, which I found via this popular
Stackexchange question and its answers.
I'm probably going to wind up keeping a copy of psig
around, as
using it on various processes here has already given me things to
think about and look into.