summaryrefslogtreecommitdiffstats
path: root/pkgs/simple/xkiller.nix
blob: 8d8f0169016c91ee4e757d42388fb641915d6080 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{ 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
''