Skip to content

Instantly share code, notes, and snippets.

@liuyangc3
Forked from amr/find-futex-wait.sh
Last active October 8, 2019 12:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save liuyangc3/bc7a47d3c2eaa06b499d to your computer and use it in GitHub Desktop.
Save liuyangc3/bc7a47d3c2eaa06b499d to your computer and use it in GitHub Desktop.
Find processes executing futex with FUTEX_WAIT (helps find deadlock-ed processes)
#!/bin/bash
#
# Find all processes that are executing a futex(2) call with op=FUTEX_WAIT
# In some cases this can be helpful in finding deadlock-ed processes.
#
test ! $UID -eq 0 && echo -e "WARNING: Not running as root, only processes for this user are being scanned\n" >&2;
pids=$(ps -u $UID -opid --no-headers)
sub_pid=$(($$+1))
for pid in $pids; do
# subshell already exited before script done
# so cat /proc/<subsell pid> will get error
# cat: /proc/xxxxx/syscall: No such file or directory
if [ "$sub_pid" != "$pid" ]; then
cat /proc/$pid/syscall |
awk "{if (\$1 == 202 && \$3 == \"0x0\") {
print $pid
}}";
fi
# $1 is the syscall, we compare to 202 which is the futex call
# See: /usr/include/asm/unistd.h
# $2 is the 1st param, $3 is the 2nd param, etc
# We compare the second param to 0x0 which is FUTEX_WAIT
# See: /usr/include/linux/futex.h
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment