通过 bash 脚本使用 systemctl 编辑?

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在直接添加一个插件之后。


Gra*_*art 5

由于我还没有找到如何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正在做的事情。


Neu*_*tic 5

您可以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)。