如何为systemd编写启动脚本


233

我的笔记本电脑上有2个图形卡。一个是IGP,另一个是离散的。

我已经编写了一个Shell脚本来关闭独立显卡。

如何将其转换为systemd脚本以在启动时运行它?

Answers:


332

主要有两种方法可以做到这一点:

  • 如果必须运行脚本,则无需转换,而是通过systemd服务运行脚本。

因此,您需要两个文件:脚本和.service文件(单元配置文件)。
确保您的脚本是可执行文件,并且第一行(shebang)是#!/bin/sh。然后在中创建.service文件/etc/systemd/system(纯文本文件,称为vgaoff.service)。
例如:

  1. 剧本: /usr/bin/vgaoff
  2. 单位文件: /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

如果vgaoff用于关闭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手册页。


故障排除
从这里开始:
如何查看systemd服务的完整日志?
systemd服务出口代码和状态信息说明


感谢您的详细回答。脚本中包含一个命令“回声OFF> / SYS /内核/调试/ vgaswitcheroo /开关”
Sharique

它失败并显示以下消息vgaoff.service-关机gpu已加载:已加载(/usr/lib/systemd/system/vgaoff.service;已启用)活动:自2012年9月11日星期二以来失败(结果:退出代码)23: 46:46 +0530; 30年代前处理:5258 ExecStart = / usr / lib中/ systemd /脚本/ vgaoff(代码=退出,状态= 203 / EXEC)CGROUP:名称= systemd:/system/vgaoff.service
Sharique

糟糕,我又错过了这个小东西,一切正常。.再次感谢。
Sharique 2012年

5
@Bazon-根据此逻辑,该站点上成千上万的答案是针对没有经验的用户的“潜在陷阱”。不了解/完全了解echo SOMETHING > /some/file功能(或实际上是任何其他命令)的人们在尝试在系统上运行内容之前应熟悉CLI的基础知识。另外,FYI,请阅读如何在几种笔记本电脑型号上关闭dGPU,看看那里使用的命令是否可以用您建议的内容代替。另外,要恢复原始文件,通常需要重新安装拥有该文件的软件包。
don_crissti

4
@don_crissti哇!谢谢你的提示。(为了避免误导性信息的传播,删除了我的原始评论。)
Woodrow Barlow
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.