有很多方法可以在 Ubuntu 启动时自动运行某些程序。可以使用“启动应用程序”实用程序在登录时运行应用程序或自定义命令,使用 crontab 安排启动作业,使用 udev 规则在检测时自动配置设备,使用 systemd-tmpfiles 服务自动创建、删除和写入配置文件。
但是,如果计算机无法正常运行,或者某些个人设置在从睡眠状态唤醒后无法保留,该怎么办?
无需等待上游修复,可以通过创建自定义 systemd 服务来解决问题,以自动重新启动该功能,或重新配置设置,并在从睡眠状态唤醒时自动触发它。
注意:ufans.top教程不仅适用于 Ubuntu,还适用于大多数使用 systemd 的 Linux,包括 Debian、Linux Mint、Fedora、Arch 及其基于它们的系统。
为root/系统范围创建唤醒操作
通过在终端(对于 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 级。
您需要用自定义命令、脚本或其他操作替换“ExecStart”的值,例如通过以下方式重新启动服务:
ExecStart=/usr/bin/systemctl restart xxx.service
启用服务。保存上述文件后(对于 nano,按 Ctrl+S 保存,然后按 Ctrl+X 退出),运行以下命令启用服务:
sudo system enable --now fan-resume.service
在这里,根据您创建的内容替换服务名称 fan-resume。
上述命令中的 --now 选项将尝试立即运行服务操作。这对于调试目的很有用,尽管您可以跳过它。
并且,运行以下命令检查服务状态。
sudo system status fan-resume.service
如果服务已加载并启用(尽管处于非活动状态)且没有任何错误,则可以暂停计算机,然后恢复以查看其是否正常运行。
仅针对用户的操作:
某些操作需要以用户身份而不是 root 身份运行。例如,使用 --user 标志重新启动服务,或自动连接到 VPN 网络。
在这种情况下,在终端(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 通过特定用户运行服务。
要仅为用户 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 替换为您创建的服务名称。