Systemd 用户计时器在重启时丢失

Systemd 用户计时器在重启时丢失

我的 Systemd 用户计时器在重启后丢失。我已使用 启用它们systemctl --user enable --now x.timer并启用了延迟。启用计时器后,它们立即正常启动并列在 下systemctl --user list-timers。但重启后,计时器又全部处于非活动状态。

操作系统是 Debian 12

重启后:

$ systemctl --user list-timers --all
NEXT LEFT LAST PASSED UNIT ACTIVATES

0 timers listed.

启用计时器后,它们将正常运行,直到下次重新启动:

$ systemctl --user enable --now x.timer

$ systemctl --user list-timers
NEXT                        LEFT           LAST                        PASSED     UNIT    
Sat 2024-04-27 14:21:22 EDT 1h 19min left  -                           -          x.timer

此外,重新启动后当计时器丢失时,systemctl --list-dependencies会显示计时器但未启用:

$ systemctl --user list-dependencies timers.target 
timers.target
○ └─x.timer

启用计时器后:

$ systemctl --user list-dependencies timers.target 
timers.target
● └─x.timer

x.服务:

[Unit]
Description=redacted description

[Service]
ExecStart=/usr/bin/redacted

[Install]
WantedBy=default.target

x.定时器

[Unit]
Description=redacted description
[Timer]
OnCalendar=*-*-* 1,9,17:30:00
RandomizedDelaySec=1h
Persistent=true

[Install]
WantedBy=timers.target

答案1

要解决此问题,请确保systemd-user服务已启用并启动:

systemctl enable systemd-user systemctl start systemd-user

该服务负责管理用户系统服务和计时器。

此外,请确保lingering为您的用户启用了该选项:

loginctl show-user <username> | grep Lingering

如果尚未启用,您可以使用以下方式启用它:

loginctl enable-linger <username>

进行这些更改后,重新启用计时器并仔细检查它们在重启后是否仍然存在。

如果您继续遇到这些奇怪的问题,请检查 Systemd 日志中是否存在与您的计时器或用户服务相关的任何错误或警告。

为提问者编辑

感谢您在评论中告诉我!

该服务的缺失systemd-user是一个关键线索。

尝试启用该user systemd manager服务在启动时自动启动:

systemctl enable user@$(whoami)

显然whoami用您的实际用户名替换。

如果这也不起作用,我还会尝试检查用户 systemd经理日志:

journalctl -u user@$(whoami)

请记住,用户 systemd 服务和计时器存储在 中~/.config/systemd/user/,因此请确保您的用户计时器位于此目录中并具有正确的所有权和权限。

第二次编辑

我认为错误消息“单元文件没有安装配置”表示该[email protected]文件不适合直接启用或启动。

因为服务在启动时已经启动,并且用户日志中没有错误,所以你是对的,我认为问题可能与计时器本身有关,就像你说的那样。

首先验证计时器文件位于~/.config/systemd/user/且具有正确的所有权和权限。

检查计时器文件中是否存在任何小拼写错误,这听起来像是愚蠢的建议,但实际上很多通常这是导致事情无法正常工作的常见原因,因为代码和命令必须非常精确,一个小小的拼写错误就可能造成问题。

还可以运行:systemctl --user status <timer_name>.timer检查其状态。

如果一切看起来都正确,让我们更深入地了解一下计时器激活过程。

尝试运行systemd-analyze plot > boot.html(作为用户)并检查图形启动图表,查看计时器启动时是否存在任何问题或延迟。

鉴于这个问题有点奇怪,有很多不同的问题可能导致它,所以你必须不断尝试,直到它被修复 - 因为事情是这样的 - 每个计算机问题,无论多么困难,都是可以修复的。

好吧,也许不是每一个电脑问题,但我确信这个是!

答案2

回答我自己的问题:

我的用户目录安装在与操作系统不同的磁盘(btrfs raid 阵列)上,并且[email protected]在磁盘安装完成之前启动了。[email protected]默认情况下,安装了一个嵌入式覆盖文件,该文件添加了一个After=systemd-user-sessions.service,因此我添加了另一个嵌入式覆盖,systemd-user-sessions.service这为我的安装添加了依赖项。

$ systemctl cat systemd-user-sessions.service 
# /lib/systemd/system/systemd-user-sessions.service
#  SPDX-License-Identifier: LGPL-2.1-or-later
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Permit User Sessions
Documentation=man:systemd-user-sessions.service(8)
After=remote-fs.target nss-user-lookup.target network.target home.mount

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/lib/systemd/systemd-user-sessions start
ExecStop=/lib/systemd/systemd-user-sessions stop

# /etc/systemd/system/systemd-user-sessions.service.d/override.conf
[Unit]
After=srv-mybtrfsarray.mount

相关内容