当笔记本电脑使用电池或登录时,有没有办法使用 systemd 来启动/停止服务?
作为开发人员,拥有 mongodb 和 redis autostart 之类的东西很有帮助,但我想在使用电池时暂停它们以尽可能节省。
这里有一篇关于此的很棒的文章:https://chrisdown.name/2017/10/29/adding-power-lated-targets-to-systemd.html
\n选项1
\n基本上你必须执行以下操作:
\n创建systemd
启用交流电源的目标:
cat > /etc/systemd/system/ac.target << \'EOF\'\n[Unit]\nDescription=On AC power\nDefaultDependencies=no\nStopWhenUnneeded=yes\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n创建systemd
使用电池电源运行的目标:
cat > /etc/systemd/system/battery.target << \'EOF\'\n[Unit]\nDescription=On battery power\nDefaultDependencies=no\nStopWhenUnneeded=yes\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n重新启动系统或简单地运行systemctl daemon-reload
以加载这些新的配置文件。
添加udev
触发状态变化的规则:
cat > /etc/udev/rules.d/99-powertargets.rules << \'EOF\'\nSUBSYSTEM=="power_supply", KERNEL=="AC", ATTR{online}=="0", RUN+="/usr/sbin/systemctl start battery.target"\nSUBSYSTEM=="power_supply", KERNEL=="AC", ATTR{online}=="1", RUN+="/usr/sbin/systemctl start ac.target"\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n现在重新启动系统或运行udevadm control --reload-rules
以激活新添加的udev
配置文件。
之后您可以查询当前系统状态
\n$ sudo systemctl status battery.target\n\xe2\x97\x8f battery.target - On battery power\n Loaded: loaded (/etc/systemd/system/battery.target; static; vendor preset: disabled)\n Active: inactive (dead)\n\nOct 29 12:24:33 HOSTNAME systemd[1]: Reached target On battery power.\nOct 29 12:24:33 HOSTNAME systemd[1]: battery.target: Unit not needed anymore. Stopping.\nOct 29 12:24:33 HOSTNAME systemd[1]: Stopped target On battery power.\n
Run Code Online (Sandbox Code Playgroud)\n然后,您可以创建systemd
使用这些新状态的新服务脚本。例如
$ systemctl cat powerdown.service\n# /etc/systemd/system/powerdown.service\n[Unit]\nDescription=Laptop battery savings\n\n[Service]\nType=oneshot\nExecStart=/usr/local/bin/powerdown\n\n[Install]\nWantedBy=battery.target\n
Run Code Online (Sandbox Code Playgroud)\n选项2
\n如果您真的不想尝试所有的systemd
复杂性,您可以仅使用该udev
部分并直接在其上运行脚本。
cat > /etc/udev/rules.d/99-my-battery-commands.rules << \'EOF\'\nSUBSYSTEM=="power_supply", KERNEL=="AC", ATTR{online}=="0", RUN+="/usr/local/bin/script-to-run-when-losing-ac-power"\nSUBSYSTEM=="power_supply", KERNEL=="AC", ATTR{online}=="1", RUN+="/usr/local/bin/script-to-run-when-ac-power-restored"\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n并使用udevadm control --reload-rules
(并且udevadm trigger
似乎也有效)来加载新配置。
如果您想在某个 shell 脚本中了解当前交流电源是否可用,只需运行on_ac_power
. 如果连接了交流电源,它会默默地返回 true 退出代码,如果使用电池运行,则返回 false。请注意,on_ac_power
如果在没有电池的系统(例如桌面系统)中运行,则返回 true 太愚蠢了。
归档时间: |
|
查看次数: |
1863 次 |
最近记录: |