Title: How to trigger a command on Linux when disconnected from power | |
Author: Solène | |
Date: 31 May 2025 | |
Tags: security linux | |
Description: In this blog post, you will learn how to trigger a command | |
when a laptop is disconnected from power supply | |
# Introduction | |
After thinking about BusKill product that triggers a command once the | |
USB cord disconnects, I have been thinking at a simple alternative. | |
BusKill official project website | |
When using a laptop connected to power most of the time, you may want | |
it to power off once it gets disconnected, this can be really useful if | |
you use it in a public area like a bar or a train. The idea is to | |
protect the laptop if it gets stolen while in use and unlocked. | |
Here is how to proceed on Linux, using a trigger on an udev rule | |
looking for a change in the power_supply subsystem. | |
For OpenBSD users, it is possible to use apmd as I explained in this | |
article: | |
=> Rarely known OpenBSD features: apmd daemon hooks | |
In the example, the script will just power off the machine, it is up to | |
you to do whatever you want like destroy the LUKS master key or trigger | |
the coffee machine :D | |
# Setup | |
Create a file `/etc/udev/rules.d/disconnect.rules`, you can name it how | |
you want as long as it ends with `.rules`: | |
``` | |
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", ENV{POWER_SUPPLY_TYPE… | |
``` | |
Create a file `/usr/local/bin/power_supply_off` that will be executed | |
when you unplug the laptop: | |
``` | |
#!/bin/sh | |
echo "Going off because power supply got disconnected" | systemd-cat | |
systemctl poweroff | |
``` | |
This simple script will add an entry in journald before triggering the | |
system shutdown. | |
Mark this script executable with: | |
``` | |
chmod +x /usr/local/bin/power_supply_off | |
``` | |
Reload udev rules using the following commands: | |
``` | |
udevadm control --reload-rules | |
udevadm trigger | |
``` | |
# Testing | |
If you unplug your laptop power, it should power off, you should find | |
an entry in the logs. | |
If nothing happens, looks at systemd logs to see if something is wrong | |
in udev, like a syntax error in the file you created or an incorrect | |
path for the script. | |
# Script ideas | |
Depending on your needs, here is a list of actions the script could do, | |
from gentle to hardcore: | |
* Lock user sessions | |
* Hibernate | |
* Proper shutdown | |
* Instant power off (through sysrq) | |
* Destroy LUKS master key to make LUKS volume unrecoverable + Instant | |
power off | |
# Conclusion | |
While BusKill is an effective / unusual product that is certainly | |
useful for a niche, protecting a running laptop against thieves is an | |
extra layer when being outside. | |
Obviously, this use case works only when the laptop is connected to | |
power. |