我有一个 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