systemd start stop 使用一个目标单元启用和禁用多个服务

systemd start stop 使用一个目标单元启用和禁用多个服务

我创建了一个目标文件 /etc/systemd/system/watch-for-sync-need-all.target

[Unit]
Description=systemd target to group services for all folders that create a sync need by changes
After=multi-user.target
Wants=watch-for-sync-need@_sl_home_sl_.service
Wants=watch-for-sync-need@_sl_stream_sl_.service

[Install]
Also=watch-for-sync-need@_sl_home_sl_.service
Also=watch-for-sync-need@_sl_stream_sl_.service

其目的是能够启动、停止、启用或禁用所有在目标/etc/systemd/system/中指定的systemd模板服务[电子邮件受保护]

[Unit]
Description=watch sync folders for changes then flag sync need and set rtcwake
BindsTo=watch-for-sync-need-all.target
After=watch-for-sync-need-all.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/bin/bash /etc/custom/notify-on-change %i
Restart=on-failure
RestartSec=3

[Install]
WantedBy=watch-for-sync-need-all.target

如果它必须处理我的问题,我发布 /etc/custom/notify-on-change 的调用脚本内容

#! /usr/bin/env bash

inotifywait -q -m -r -e modify,delete,create "${1//_sl_//}" | while read DIRECTORY EVENT FILE
do
    echo "yes" > /etc/custom/log/sync-needed
    bash /etc/custom/set-rtcwake
    systemctl stop watch-for-sync-need-all.target
done

如果文件夹 /home/ 或 /stream/ 发生变化,inotifywait 会注意到,标记同步需要,设置计算机在即将到来的晚上 3 点自动唤醒并停止服务。 (机器上有一个 cronjob,如果标记了同步需要,它会在 3 点钟左右同步到另一台计算机。计算机在不使用时会自行关闭。这样,我可以在我的计算机上工作并制作/home/ 或 /stream/ 发生更改,然后且只有这样,同步才会很快自动开始。)

我的问题是,我无法充分实现我的目标。目标可以毫无问题地启动或停止。这意味着两个“子”单元都在运行。启用不会发出任何警告,并在目录 /etc/systemd/system/watch-for-sync-need-all.target.wants 中创建相应的链接,但是当我的机器启动时,“子”单元没有运行。新启动后我得到以下输出

systemctl status watch-for-sync-need-all.target 

watch-for-sync-need-all.target - systemd target to group services for all folders that create a sync need by ch>
Loaded: loaded (/etc/systemd/system/watch-for-sync-need-all.target; indirect; vendor preset: enabled)
Active: inactive (dead)`enter code here`

或者

systemctl status watch-for-sync-need@_sl_home_sl.service

watch-for-sync-need@_sl_home_sl.service - watch sync folders for changes then flag sync need and set rtcwake
Loaded: loaded (/etc/systemd/system/[email protected]; disabled; vendor preset: enabled)
Active: inactive (dead)

如何让 systemd 在系统启动时启动目标(所有“子”单元)?

答案1

在 /etc/systemd/system/watch-for-sync-need-all.target 的安装部分中,必须将 multi-user.target 添加为 WantedBy,现在它可以工作了。在这个堆栈溢出线程中具有多个 execStart 的 Systemd Johny 的评论 5 提到了这一点。

我不明白为什么需要这样做,因为目标应该像单元部分中定义的那样在 multi-user.target 之后启动,据我所知,单元部分解释了对其的所有操作,包括启用在系统启动时。

无论如何,我希望这个帖子和答案有所帮助。

相关内容