我遇到了一个问题,如果我自己运行 bash 脚本,unison 会按预期工作,但当 systemd 通过计时器上的服务运行它时,它却无法按预期工作。我正在记录 unison 可执行文件的输出,但没有任何结果。这里可能发生了什么?
有问题的脚本是这样的...
#!/bin/bash
echo "`date -u` `unison "USB Work" -batch`" >> /home/tom/timer.log
...从命令行运行时运行良好。文件是 /usr/local/bin/unison.sync.usb-work。
我的服务 /etc/systemd/system/unison-timer-usb-work.service 看起来像这样...
[Unit]
Description=Unison timer - sync work to USB
[Service]
Type=simple
ExecStart=/usr/local/bin/unison.sync.usb-work
...该服务由以下计时器 (etc/systemd/system/unison-timer-usb-work.timer) 每 10 分钟成功运行一次...
[Unit]
Description=Runs Unison USB Work sync script every 10 mins
[Timer]
# Time to wait after booting before we run first time
OnBootSec=1min
# Time between running each consecutive time
OnUnitActiveSec=10min
Unit=unison-timer-usb-work.service
[Install]
WantedBy=multi-user.target
所有这些似乎都设置正确,systemctl list-timers 显示它处于活动状态......
NEXT LEFT LAST PASSED UNIT ACTIVATES
n/a n/a lun 2015-08-03 08:50:25 CEST 8h ago ureadahead-stop.timer ureadahead-stop.service
lun 2015-08-03 17:00:40 CEST 9min left lun 2015-08-03 16:50:40 CEST 30s ago unison-timer-usb-work.timer unison-timer-usb-work.service
...并且 /home/tom/timer.log 文件每 10 分钟获取一次带有时间戳的新空白条目。
为什么脚本可以从终端运行(不使用 sudo 和使用 sudo)而不是从计时器运行?!
在此先感谢您的帮助,
汤姆。
答案1
systemd 有两种“模式”:系统和用户。当 systemd 作为系统实例运行时,默认情况下,所有内容都以 root 身份运行。当 systemd 作为用户实例运行时,所有内容都以启动 systemd 实例的用户身份运行。此外,还为启动的服务设置了一组有限的变量。对于系统实例,默认情况下仅设置LANG
和PATH
(至少在 Ubuntu 15.04 上)。对于用户实例,除了前面的变量外,还设置了HOME
、、LOGNAME
和。SHELL
XDG_RUNTIME_DIR
就您而言,根据进程的输出,进程应该在用户帐户下运行,而不是以 root 身份运行。正确的解决方法是将服务文件移动到 或/etc/systemd/user
,~/.config/systemd/user
以便服务在用户的 systemd 下启动。