stockholm/tv/5pkgs/simple/xkiller.nix

26 lines
700 B
Nix
Raw Normal View History

2019-01-07 14:29:48 +00:00
{ pkgs }:
pkgs.writeDash "xkiller" ''
set -efu
exec >&2
${pkgs.iproute}/bin/ss -lp src unix:/tmp/.X11-unix/X* |
${pkgs.gnused}/bin/sed -n '
s|.*/tmp/.X11-unix/X\([0-9]\+\)\>.*("X[^"]*",pid=\([0-9]\+\)\>.*|\1 \2|p
' |
while read -r display pid; do
{
exit_code=$(
DISPLAY=:$display ${pkgs.coreutils}/bin/timeout 1 \
${pkgs.xorg.xset}/bin/xset q >/dev/null 2>&1 &&
echo 0 || echo $?
)
if test $exit_code = 124; then
echo "X on display :$display is locked up; killing PID $pid..."
${pkgs.coreutils}/bin/kill -SIGKILL "$pid"
else
echo "X on display :$display is healthy"
fi
} &
done
wait
''