在启动另一个 systemd 服务时停止该服务

在启动另一个 systemd 服务时停止该服务

我编写了一个简单的 zram.service 文件,它将为我设置压缩交换空间,以避免占用过多的磁盘空间。zram 的优先级高于其他交换设备。

问题是,当我尝试使系统休眠时,它会将系统状态写入交换区(在本例中为 zram),并且由于断电时内存内容会丢失,所以这当然不起作用。

解决方案是在执行 systemctl hibernate 之前停止我的 zram.service,并在系统重新启动时重新启动它。

据我所知,systemctl hibernate 启动 /lib/systemd/system/systemd-hibernate.service。我已将此服务复制到 /etc/systemd/system/ 以覆盖它,我可能可以使用“ExecStartPost=”节来使其工作,但我认为一定有更好的方法在启动另一个 systemd 服务时停止它,反之亦然。

编辑:对于那些有兴趣的人来说,Debian 系统上工作的 zram 服务

[Unit]
Description=ZRAM swap
Conflicts=hibernate.service

[Service]
Environment=ZRAM_MEM=1G
Environment=ZRAM_CMPALGO=lz4
Environment=ZRAM_CMPSTREAMS=2


Type=oneshot
User=root
ExecStartPre=/bin/sh -c "/sbin/modprobe zram num_devices=1"
ExecStartPre=/bin/sh -c "echo $ZRAM_CMPALGO >/sys/block/zram0/comp_algorithm"
ExecStartPre=/bin/sh -c "echo $ZRAM_CMPSTREAMS >/sys/block/zram0/max_comp_streams"
ExecStartPre=/bin/sh -c "echo $ZRAM_MEM > /sys/block/zram0/disksize"
ExecStartPre=/bin/sh -c "/sbin/mkswap /dev/zram0"
ExecStart=/sbin/swapon /dev/zram0 -p 10

ExecStop=/sbin/swapoff /dev/zram0
ExecStop=/bin/echo 1 > /sys/block/zram0/reset
ExecStop=/sbin/rmmod zram

RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

答案1

Conflicts=在 systemd 单元文件中定义。

来自 systemd.unit 手册页:

冲突=

以空格分隔的单元名称列表。配置负面要求依赖关系。如果一个单元对另一个单元有 Conflicts= 设置,则启动前者将停止后者,反之亦然。请注意,此设置与 After= 和 Before= 排序依赖关系无关且正交。

如果与单元 B 冲突的单元 A 计划与单元 B 同时启动,则事务要么失败(如果两者都是事务的必需部分),要么被修改以进行修复(如果一个或两个作业都不是事务的必需部分)。在后一种情况下,将删除非必需的作业,或者如果两者都不是必需的,则将启动冲突的单元并停止冲突的单元。

相关内容