Eu finalmente resolvi esse problema.
O problema, penso eu, tem a ver com o timing de tudo.
Alterei minhas regras do udev para ambas no mesmo subsistema
SUBSYSTEM=="block", ATTRS{serial}=="serialforusbdrive", SYMLINK+="kingston%n"
SUBSYSTEM=="block", ATTRS{serial}=="serialforusbdrive", RUN+="/usr/local/bin/backup.sh"
Em seguida, adicionamos as seguintes linhas ao início do script.
sleep 5
stat /dev/kingston1
Eu acho que o tempo estava um pouco errado e ele tentaria montar antes que o disco estivesse pronto, e o subsistema "usb" estivesse disparando antes do subsistema "block", então meu symlink não existia quando o script realmente correu.