允许 cronjob 重新启动 systemclt 用户单元

允许 cronjob 重新启动 systemclt 用户单元

我有一个 systemctl用户单元:

[Unit]
Description=my app
Wants=network.target
After=syslog.target network-online.target

[Service]
Type=exec
ExecStart=/home/user/bin/myapp
StandardOutput=append:/home/user/log.log
StandardError=append:/home/user/log.log
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

我创建了这个 cronjob:

* *  *   *   *    /usr/bin/systemctl restart --user myapp.service

但它失败并出现以下错误:

无法连接到总线:$DBUS_SESSION_BUS_ADDRESS 和 $XDG_RUNTIME_DIR 未定义(考虑使用[电子邮件受保护]--用户连接到其他用户的总线)

从控制台输入完全相同的命令它工作正常,因此问题仅与 tyo cron 相关。

我还发现了一些其他答案,例如但我不明白如何设置这些变量以与 cron 一起使用。

顺便说一句,我正在使用 Ubuntu 22.04。

答案1

首先,你需要留住你的用户:

# loginctl enable-linger <user>

然后你必须正常登录你的<user>或做

sudo machinectl shell <user>@.host

进入后,将这些环境变量复制到 crontab 中。

你的 crontab 应该是这样的:

DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<uid>/bus
XDG_RUNTIME_DIR=/run/user/<uid>
* *  *   *   *    /usr/bin/systemctl restart --user myapp.service

另一方面,你必须改变你的目标。用户目标与系统目标不同。要列出用户可用的目标,请执行以下操作:

$ systemctl --user --type=target

相关内容