systemd per user systemd-timer是否为离线用户运行?如果没有,是否可以允许它们为特定组内的用户运行?计时器的目标服务是否会像它应该以这种方式运行的用户一样正确启动?
我想在每个月的最后一天运行一个服务文件。这个怎么配置?我指的是Systemd.timers,但无法找到正确的方法。
此外,是否可以添加另一个配置以在该月的最后一个工作日运行?(除了sun和sat之外的天数)
我有一个更新我的谷歌驱动器的脚本。我制作了一个 systemd 单元来运行这个脚本,以及一个每 10 秒运行一次该单元的计时器,两者都可以工作。但是,当我与互联网断开连接时,即使互联网重新打开,脚本也会失败并且 systemd 停止运行它。有什么办法可以让 systemd 继续运行脚本,或者有没有办法让 systemd 仅在有互联网连接的情况下运行脚本?
这是文件
/etc/systemd/system/grive.service:
[Unit]
Description=Syncronize google drive folder
[Service]
User=my_name
ExecStart=/home/my_name/bin/update-grive
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/grive.timer:
[Unit]
Description=Timer for how often to syncronize google drive folder
[Timer]
OnUnitActiveSec=10s
OnBootSec=10s
[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)
/home/my_name/bin/update-grive:
#!/usr/bin/env bash
cd /home/my_name/gdrive
grive
Run Code Online (Sandbox Code Playgroud) 我一直在将我的 crontab 迁移到 systemd 的计时器单元。它们看起来都类似于:
.timer 文件:
[Unit]
Description=timer that uses myjob.service
[Timer]
OnCalendar=*-*-* *:00:00
Unit=myjob.service
[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)
.service 文件:
[Unit]
Description=Script that runs myjob.sh
[Service]
ExecStart=/home/user/myjob.sh
Run Code Online (Sandbox Code Playgroud)
我的计时器可以工作,但它们也会在系统重新启动时执行。我希望我的 OnCalendar 事件只在指定的时间运行,而不是在我重新启动 PC 的任何随机时间运行。有任何想法吗?
更新:我通过将我的“用户”计时器转换为根/系统计时器解决了这个问题。
我禁用了所有 .service 和 .timer 文件,并将它们从我的主目录中移到 /etc/systemd/system 中。
我在每个服务文件中添加了“用户 =”部分,以便我的脚本由普通用户而不是 root 用户运行。
现在我的计时器没有在系统启动时被触发,当我通过 ssh 登录时,我也遇到了偶发触发的问题。现在这也已解决,因为它们受 root 帐户的控制,但运行我的脚本仍然作为普通用户的 PID 运行,这保留了我的文件的所有权属性。问题解决了。
我正在寻找一个每 1 小时 18 分钟运行一次的 systemd 计时器,但我只有这个线索。
systemd-analyze --iterations=3 calendar *:0/18
每 18 分钟一班。
我正在尝试设置每 4 小时运行一次的 systemd 时间。当计时器触发时,运行脚本来更新一些数据文件。我每 2 小时在整点 30 分钟跟踪一次 systemd 计时器?和systemd 计时器每 15 分钟一次。
\n\n文件/etc/systemd/system/ftc-data.service
:
[Unit]\nDescription=Fetch FTC Do Not Call data files\n\n[Service]\nType=oneshot\nExecStart=/var/ftc/ftc-data/fetch-data.sh\n
Run Code Online (Sandbox Code Playgroud)\n\n文件/etc/systemd/system/ftc-data.timer
:
[Unit]\nDescription=Run ftc-data.service every 4 hours\n\n[Timer]\nOnCalendar=00/4:00\n\n[Install]\nWantedBy=timers.target\n
Run Code Online (Sandbox Code Playgroud)\n\n这就是问题出现的地方:
\n\nsystemctl enable /etc/systemd/system/ftc-data.timer\nsystemctl start /etc/systemd/system/ftc-data.timer\nsystemctl enable /etc/systemd/system/ftc-data.service\n
Run Code Online (Sandbox Code Playgroud)\n\n命令的结果是:
\n\n# systemctl enable /etc/systemd/system/ftc-data.timer\n\n# systemctl start /etc/systemd/system/ftc-data.timer\nFailed to start etc-systemd-system-ftc\\x2ddata.timer.mount: Unit etc-systemd-system-ftc\\x2ddata.timer.mount not found.\n\n# systemctl enable /etc/systemd/system/ftc-data.service\nThe unit files have no installation config (WantedBy, RequiredBy, Also, Alias\nsettings …
Run Code Online (Sandbox Code Playgroud) 我遇到一个问题,在极少数情况下,我的Type=simple
systemd 服务会挂起或陷入循环。这会导致其计时器停止调度服务,因为正如通过 确认的那样sudo systemctl status myservice
,服务在应该早已退出的情况下仍在运行。我还没有弄清楚这个错误,但这并不重要。但与此同时,我不希望它停止安排未来的运行。
有没有办法在 systemd 服务文件中指定最大运行时间,之后它将强制停止?
[Unit]
Description=scripts should run and exit but occasionally hangs or infinite loop
[Service]
SyslogIdentifier=myservice
Environment='MYVAR=myvar'
User=deanresin
Type=simple
ExecStart=/usr/bin/python3 /home/deanresin/myscript
Run Code Online (Sandbox Code Playgroud)