我的笔记本电脑上有 2 个显卡。一种是 IGP,另一种是离散型。
我编写了一个 shell 脚本来关闭独立显卡。
如何将其转换为 systemd 脚本以在启动时运行它?
答案1
主要有两种方法可以做到这一点:
带脚本
如果您必须运行脚本,则无需转换它,而是通过服务运行脚本systemd
:
因此,您需要两个文件:脚本和.service
文件(单元配置文件)。
确保您的脚本可执行并且第一行(舍邦) 是#!/bin/sh
。然后创建.service
文件/etc/systemd/system
(纯文本文件,我们称之为vgaoff.service
)。
例如:
- 剧本:
/usr/bin/vgaoff
- 单元文件:
/etc/systemd/system/vgaoff.service
现在,编辑单元文件。其内容取决于您的脚本的工作方式:
如果vgaoff
只是关闭 GPU 电源,例如:
exec blah-blah pwrOFF etc
那么内容vgaoff.service
应该是:
[Unit]
Description=Power-off gpu
[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff
[Install]
WantedBy=multi-user.target
Ifvgaoff
用于关闭 GPU 电源并重新打开 GPU 电源,例如:
start() {
exec blah-blah pwrOFF etc
}
stop() {
exec blah-blah pwrON etc
}
case $1 in
start|stop) "$1" ;;
esac
那么内容vgaoff.service
应该是:
[Unit]
Description=Power-off gpu
[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff start
ExecStop=/usr/bin/vgaoff stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
无脚本
对于最简单的情况,您可以不使用脚本并直接执行某个命令:
关闭电源:
[Unit]
Description=Power-off gpu
[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"
[Install]
WantedBy=multi-user.target
关闭和打开电源:
[Unit]
Description=Power-off gpu
[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"
ExecStop=/bin/sh -c "echo ON > /whatever/vga_pwr_gadget/switch"
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
启用服务
完成文件后,启用该服务:
systemctl enable vgaoff.service
它将在下次启动时自动启动。您甚至可以一次性启用并启动该服务
systemctl enable --now vgaoff.service
截至systemd v.220
(在较旧的设置上,您必须手动启动它)。
欲了解更多详情,请参阅systemd.service
手册页。
故障排除
答案2
在systemd中添加启动项是复杂而繁琐的。为了让这更方便,我写了一个工具添加服务它提供了一种在systemd中快速添加启动项的简单方法。
安装:
pip3 install add_service
用法:
python -m add_service [shell_file/cmd] [user (default `whoami`)]
例子:
python -m add_service ssh_nat.sh # by default user is `whoami`
python -m add_service "`which python3` -m http.server 80" root