26 lines
700 B
Nix
26 lines
700 B
Nix
|
{ 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
|
||
|
''
|