在Ubuntu18.04上,我想在systemd-udevd启动之前运行一个shell脚本。
原因是这个bug:Ubuntu18.04系统使用高CPU,与nvidia图形冲突
解决方案,只是移动规则71-nvidia.rules,使它不会被找到,将不会对我工作:我有一个Razer隐身,我操作与和没有Razer (带Nvidia卡)。当笔记本电脑连接到Razer Core (通过雷电-3)时,一切都很好。但是当笔记本电脑没有连接时,我遇到了另一个问题所描述的同样的问题。
作为一种解决办法,我想将/lib/udev/rules.d/71-nvidia.rules迁移到/lib/udev/rules.available/71-nvidia.rules。然后,shell脚本应该使用lspci来确定是否找到了nvidia卡。如果找到一张Nvidia卡,它将创建一个指向/lib/udev/rules.available/71-nvidia.rules at /lib/udev/rules.d/71-nvidia.rules的符号链接。如果没有找到Nvidia卡,它就会删除这个符号链接。
#!/bin/bash
set -e ; set -o pipefail
mkdir -p /lib/udev/rules.available/
if [ ! -e /lib/udev/rules.available/71-nvidia.rules ] ; then
mv /lib/udev/rules.{d,available}/71-nvidia.rules
fi
rm -f /lib/udev/rules.d/71-nvidia.rules
if lspci | grep nvidia ; then
ln -s /lib/udev/rules.{available,d}/71-nvidia.rules
fi那么,在systemd启动之前,我如何获得像上面这样的shell脚本来运行呢?
P.S.:如果有人知道一个更好、更聪明的解决办法,也许有systemd-udevd的内置功能,我也很想知道。
发布于 2018-09-19 13:31:39
要回答眼前的问题,只需编写一个.service单元,该单元具有Before=排序依赖于systemd-udevd.service:
[Unit]
Before=systemd-udevd.service请注意,systemd-udevd.service在早期引导期间启动,因此您也需要使用DefaultDependencies=no,并手动列出任何实际需要的依赖项。否则,您将得到一个排序循环。
把所有的东西放在一起,这个单位看起来会是这样的:
# /etc/systemd/system/udev-nvidia-hack.service
[Unit]
DefaultDependencies=no
Before=systemd-udevd.service
RequiresMountsFor=/lib/udev /etc/udev /path/to/script
[Service]
Type=oneshot
ExecStart=/path/to/script.sh
[Install]
WantedBy=sysinit.target但是,在检查71-nvidia.rules文件时,当没有匹配的设备时,您将有一个更好的解决方案来检查它为什么会影响系统。
https://askubuntu.com/questions/1073056
复制相似问题