有很多方法可以在 Ubuntu 启动时自动运行某些程序。可以使用“启动应用程序”实用程序在登录时运行应用程序或自定义命令,使用 crontab 安排启动作业,使用 udev 规则在检测时自动配置设备,使用 systemd-tmpfiles 服务自动创建、删除和写入配置文件。

但是,如果计算机无法正常运行,或者某些个人设置在从睡眠状态唤醒后无法保留,该怎么办?

无需等待上游修复,可以通过创建自定义 systemd 服务来解决问题,以自动重新启动该功能,或重新配置设置,并在从睡眠状态唤醒时自动触发它。

注意:ufans.top教程不仅适用于 Ubuntu,还适用于大多数使用 systemd 的 Linux,包括 Debian、Linux Mint、Fedora、Arch 及其基于它们的系统。

为root/系统范围创建唤醒操作

  1. 通过在终端(对于 Ubuntu,按 Ctrl+Alt+T)窗口中运行以下命令来创建 systemd 服务文件。

    sudo gnome-text-editor /etc/systemd/system/fan-resume.service

这里我使用 gnome-text-editor 在 /etc/systemd/system 目录下创建(并编辑)一个 fan-resume.service 文件。

您可以根据您的桌面环境替换文本编辑器,例如,XFCE 使用 mousepad,MATE 使用 pluma,大多数桌面和服务器都使用 nano 命令行文本编辑器。

根据您想要执行的操作,您可以将文件名 fan-resume 替换为您想要的任何名称。当文件在文本编辑器中打开时,添加以下行并进行相应编辑:

[Unit]
Description=Resume fan speed after waking up
After=suspend.target

[Service]
Type=simple
ExecStart=/usr/bin/bash -c "echo level 1 | tee /proc/acpi/ibm/fan"

[Install]
WantedBy=suspend.target

上面的行指示从挂起状态唤醒后触发操作。您可以将 2 个 suspend.target 替换为:

  • hibernate.target
  • hybrid-sleep.target
  • suspend-then-hibernate.target

或者使用 sleep.target 来从上述所有睡眠状态恢复。
当它触发时,它会运行 echo level 1 |在我的情况下,在具有 root 权限的 bash shell 中执行 /proc/acpi/ibm/fan 命令,将我的 Thinkpad 风扇速度设置为 1 级。
fan-resume
您需要用自定义命令、脚本或其他操作替换“ExecStart”的值,例如通过以下方式重新启动服务:

ExecStart=/usr/bin/systemctl restart xxx.service
  1. 启用服务。保存上述文件后(对于 nano,按 Ctrl+S 保存,然后按 Ctrl+X 退出),运行以下命令启用服务:

    sudo system enable --now fan-resume.service

在这里,根据您创建的内容替换服务名称 fan-resume。

上述命令中的 --now 选项将尝试立即运行服务操作。这对于调试目的很有用,尽管您可以跳过它。

并且,运行以下命令检查服务状态。

sudo system status fan-resume.service

如果服务已加载并启用(尽管处于非活动状态)且没有任何错误,则可以暂停计算机,然后恢复以查看其是否正常运行。

仅针对用户的操作:

某些操作需要以用户身份而不是 root 身份运行。例如,使用 --user 标志重新启动服务,或自动连接到 VPN 网络。

  1. 在这种情况下,在终端(Ctrl+Alt+T)中运行命令以创建服务文件:

    sudo gnome-text-editor /etc/systemd/system/user-resume@.service

在这里,也相应地替换 gnome-text-editor。并且,文件名末尾需要“@”。

打开文件后,在下面添加类似的行并进行相应编辑。

[Unit]
Description=Run my script after 10s delay
After=sleep.target

[Service]
User=%I
Type=simple
ExecStartPre=/usr/bin/sleep 10
ExecStart=/usr/local/bin/myscript.sh

[Install]
WantedBy=sleep.target

与系统范围的操作不同,此处在文件名中包含 @,在服务部分下的内容中包含 User=%I。因此,可以通过启动 user-resume@USER_NAME.service 通过特定用户运行服务。

  1. 要仅为用户 ji 运行操作(替换为您的用户名),请运行命令以启用服务:

    systemctl enable --now user-resume@ji.service

然后运行 ​​systemctl status user-resume@ji.service 以检查它是否已启用且没有错误。

此外,根据您需要执行的操作,您可能需要更多自定义服务选项。有关详细信息,请参阅官方文档。

撤消上述操作:

要撤消上述操作,首先打开终端 (Ctrl+Alt+T) 并运行命令以禁用服务:

sudo systemctl disable --now xxx.service

根据您添加和启用的服务,将命令中的 xxx 替换为服务名称或 service-name@user-name。

禁用服务后,通过运行命令删除相应的文件:

sudo rm /etc/systemd/system/xxx.service

同样将 xxx 替换为您创建的服务名称。

最后修改:2024 年 10 月 10 日
如果觉得我的文章对你有用,请随意赞赏