| 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. |