use*_*897 13 startup shell-script systemd
我经常安装 Debian。为此,我有一个全自动的 preseed.cfg;在 preseed 结束时,它从我的 TFTP 服务器下载并运行 postinstall.sh 脚本,该脚本执行一些额外的自定义。
我正在从 GNOME 切换到 LXQTE,并使用 SDDM 而不是 GDM。但是,对于我的硬件而言,SDDM 尝试启动得太快。为了解决这个问题,我一直在使用systemctl edit sddm添加以下内容:
[Service]
ExecStartPre=/bin/sleep 5
Run Code Online (Sandbox Code Playgroud)
这很好用,我想通过将它添加到 postinstall.sh 脚本来自动化这个过程。但是,我不知道如何systemctl edit通过 bash 脚本将文件内容传递给。我怎样才能做到这一点?
fil*_*den 11
您可以覆盖$SYSTEMD_EDITOR环境变量以在运行systemctl edit.
例如,使用类似的东西SYSTEMD_EDITOR='cp /path/to/source.file'似乎可以正常工作(尽管它非常丑陋,但希望 systemd 将最后一个参数附加到那里!)
对于您的特定情况,您可以使用:
$ { echo "[Service]";
echo "ExecStartPre=/bin/sleep 5";
} >~/tmp/sddm-override.conf
$ sudo env SYSTEMD_EDITOR="cp $HOME/tmp/sddm-override.conf" systemctl edit sddm
Run Code Online (Sandbox Code Playgroud)
但systemctl edit真正要做的就是override.conf在/etc/systemd/system/<service>.service.d/目录下创建一个覆盖文件(在这种情况下,命名为),如果它不存在,则创建该文件......所以直接这样做也是一种完全可以接受的方法。(有关更多详细信息,请参阅 systemd.unit 手册页中提到的“插入”和“覆盖” 。)
因此,就您而言,这将是一个合适的解决方案:
$ sudo mkdir -p /etc/systemd/system/sddm.service.d/
$ { echo "[Service]";
echo "ExecStartPre=/bin/sleep 5";
} | sudo tee /etc/systemd/system/sddm.service.d/10-startup-delay.conf
$ sudo systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)
这将在您的单元的“插入”目录中放置一个包含预期内容的文件,在这种情况下,您还可以根据它尝试完成的内容对其进行适当命名。
更新:正如@GracefulRestart 指出的那样,您需要systemctl daemon-reload在直接添加一个插件之后。
由于我还没有找到如何systemctl edit在脚本中使用,最佳实践是模拟systemctl edit sddm命令并将覆盖放在 /etc/systemd/system 目录中,因为 /usr/lib/systemd/system 中的服务单元可以更改升级包时:
UNIT='sddm.service'
DIR="/etc/systemd/system/${UNIT}.d"
mkdir $DIR
echo -e "[Service]\nExecStartPre=/bin/sleep 5" > ${DIR}/override.conf
systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)
这应该大致相当于systemctl edit sddm正在做的事情。
您可以systemctl(8)使用变量更改编辑器用于其edit子命令的内容SYSTEMD_EDITOR。这本质上构造了一个命令,其最终参数始终是一个systemctl(8)创建的临时文件,一旦写入该文件,就会移动到override.conf.
因此,我们可以使用tee(1)asSYSTEMD_EDITOR然后将我们想要的任何文本从 shell 重定向到systemctl(8)stdin 上的整个命令。例如,重定向Here-Document:
SYSTEMD_EDITOR=tee systemctl edit sddm <<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF
Run Code Online (Sandbox Code Playgroud)
这将创建包含/etc/systemd/system/ssdm.service.d/override.conf"words" 之间的内容的插入文件EOF。
在后台,edit子命令看起来像这样:
# Create drop-in directory for service
mkdir -p /etc/systemd/system/ssdm.service.d
# Create empty temporary file
touch /etc/systemd/system/ssdm.service.d/.
# Pass temporary file as last argument of SYSTEMD_EDITOR
tee /etc/systemd/system/sddm.service.d/.\#override.conf846580011dbe64db/.\#override.conf846580011dbe64db<<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF
# Rename temporary file
mv /etc/systemd/system/sddm.service.d/{.\#override.conf846580011dbe64db,override.conf}
Run Code Online (Sandbox Code Playgroud)
编辑完单元后,systemd 配置会自动重新加载(以等效于 的方式daemon-reload)。