我们有一台运行大量 cron 作业的服务器,我们希望将其转移到 systemd 计时器。在创建 .service 和 .timer 文件的过程中,我遇到了CentOS 上的这个错误(我们正在使用)。为了确保我们不会遇到同样的问题,我选择将 .service 文件指向一个简单的 Python 脚本,该脚本仅打印时间和环境变量的值。我让它运行了几天,我发现虽然计时器本身按时触发,但有时实际的服务不会运行。这是我的journalctl
单元文件的结果:
Feb 03 15:52:28 li681-190 python3[12230]: Service "Business Script" ran at 2020-02-03 15:52:28.483885
Feb 03 15:52:28 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:53:46 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:53:46 li681-190 python3[12296]: Service "Business Script" ran at 2020-02-03 15:53:46.299353
Feb 03 15:53:46 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:55:01 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:55:01 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:56:01 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:56:01 li681-190 python3[12427]: Service "Business Script" ran at 2020-02-03 15:56:01.952895
Feb 03 15:56:01 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:57:02 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:57:02 li681-190 python3[12539]: Service "Business Script" ran at 2020-02-03 15:57:02.790428
Feb 03 15:57:02 li681-190 systemd[1]: Started business_script.py runner.
正如您所看到的,有时服务会运行测试脚本,有时则不会。我知道使用oneshot
withOnUnitActiveSec
可能会出现问题,如此处所述systemd 问题 6680 评论,这很奇怪,因为它对我来说仍然运行得很好。顺便说一句,我有一些OnCalendar
脚本在计时器触发时并不总是启动服务。为什么我的服务总是不运行?我们运行的是 CentOS 7-6.1810。
我的 .timer 文件如下所示:
[Unit]
Description=Run business-script.py script every minute.
Requires=business-script.service
[Timer]
Unit=business-script.service
OnBootSec=1min
OnUnitActiveSec=1min
[Install]
WantedBy=timers.target
我的 .service 文件如下所示:
[Unit]
Description=timer_test.py runner
After=network.target
[Service]
User=business-script-user
Group=business-script-user
Type=oneshot
WorkingDirectory=/usr/local/bin/
ExecStart=/usr/bin/python3 timer-test.py
Environment='SERVICE_NAME="Business Script"'
[Install]
WantedBy=multi-user.target
我写的Python脚本如下:
import datetime
import os
def main():
service_name = os.getenv('SERVICE_NAME')
now = datetime.datetime.now()
print('Service {} ran at {}'.format(service_name, now))
if __name__ == '__main__':
main()
答案1
所以我决定检查整个系统journalctl
,我发现脚本实际上确实触发了,但它没有登录到单元文件中。我想我原来的问题现在不正确,需要对不同的问题进行更多调查。
对于遇到此问题的任何人,请查看journalctl
而不是journalctl -u your-unit.service
.您的服务正在运行的证明可能就在那里。