如何编写Systemd的启动脚本?

如何编写Systemd的启动脚本?

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

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

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

答案1

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

带脚本

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

因此,您需要两个文件:脚本和.service文件(单元配置文件)。
确保您的脚本可执行并且第一行(舍邦) 是#!/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

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

相关内容