目标

目标

三个星期过去了,我仍然没能弄清楚为什么这个systemd定时服务不会运行。我不会列出我所做的所有研究,而是简单地展示我正在努力的方向。

如果有人能指出我在哪里寻找问题的方向,我将非常感激。

目标

使用 Flameshot 每分钟抓取一次屏幕截图。

零碎的事

bash脚本

输出来自test@test-i3:~$ cat /usr/share/screenmonitor/screenMonitor.bash

#!/bin/bash
/usr/bin/flameshot full --path /home/test/.screenshots
exit

系统服务单元

输出来自test@test-i3:~$ cat /etc/systemd/system/screenMonitor.service...

[Unit]
Description=Capture screenshots at a given interval
Wants=screenMonitor.timer

[Service]
Type=simple 
User=test
Group=test
ExecStart=/usr/share/screenmonitor/screenMonitor.bash

[Install]
WantedBy=multi-user.target

Systemd定时器单元

输出来自test@test-i3:~$ cat /etc/systemd/system/screenMonitor.timer

[Unit]
Description=Capture screenshots at a given interval
Requires=screenMonitor.service

[Timer]
Unit=screenMonitor.service
OnCalendar=*-*-* *:*:00

[Install]
WantedBy=timers.target

故障排除

问题

预期的屏幕截图没有显示在/home/test/.screenshots

寻找问题

  1. bash 脚本是否手动运行?是的,这确实会在预期文件夹中创建屏幕截图:test@test-i3:~$ /usr/share/screenmonitor/screenMonitor.bash

  2. 服务是否被触发?并运行成功?是的,日志显示服务正在按预期时间间隔成功运行。

Apr 11 08:06:31 test-i3 systemd[1]: Started Capture screenshots at a given interval.
Apr 11 08:06:31 test-i3 systemd[1]: screenMonitor.service: Succeeded.
Apr 11 08:07:31 test-i3 systemd[1]: Started Capture screenshots at a given interval.
Apr 11 08:07:31 test-i3 systemd[1]: screenMonitor.service: Succeeded.
Apr 11 08:08:31 test-i3 systemd[1]: Started Capture screenshots at a given interval.
Apr 11 08:08:31 test-i3 systemd[1]: screenMonitor.service: Succeeded.

问题

因此,脚本有效,服务显示已成功运行,但没有显示屏幕截图。接下来我该在哪里找到 systemd 服务没有返回预期屏幕截图的原因?

编辑 - 添加更完整的日志

我在哪里可以找到这个 systemd 单元确实作为系统任务运行而不是在用户会话中运行?

@MarcusMüller 说“系统任务无法知道...在您的用户会话上运行所需的设置。”我希望他是正确的。

但我仍然没有在日志中看到它systemd 单元设置为以用户身份运行。

导出一组更详细的日志(例如@foshyboy提及) 显示 systemd 单元按预期时间间隔成功运行。

test@test:~$ sudo journalctl -u screenMonitor.service -o verbose | tail -n57
Mon 2022-05-02 15:14:11.634017 -03 [s=54677f9d50e54de79146a6d96eddd5d3;i=dbd;b=7847eb41c0ef46eeb98aab83c90091c7;m=5457c5970;t=5de0b5bea2f81;x=1377c5d4806eaaf]
    PRIORITY=6
    SYSLOG_FACILITY=3
    SYSLOG_IDENTIFIER=systemd
    UNIT=screenMonitor.service
    _TRANSPORT=journal
    _PID=1
    _UID=0
    _GID=0
    _COMM=systemd
    _EXE=/usr/lib/systemd/systemd
    _CMDLINE=/sbin/init
    _CAP_EFFECTIVE=3fffffffff
    _SELINUX_CONTEXT=unconfined
    _SYSTEMD_CGROUP=/init.scope
    _SYSTEMD_UNIT=init.scope
    _SYSTEMD_SLICE=-.slice
    _BOOT_ID=7847eb41c0ef46eeb98aab83c90091c7
    _MACHINE_ID=279c8612447944b6925e3f6aa4adf4b8
    _HOSTNAME=test
    CODE_FILE=../src/core/job.c
    CODE_LINE=950
    CODE_FUNC=job_log_done_status_message
    MESSAGE=Started Capture screenshots at a given interval.
    JOB_TYPE=start
    JOB_RESULT=done
    MESSAGE_ID=39f53479d3a045ac8e11786248231fbf
    JOB_ID=50117
    INVOCATION_ID=40e5dd06027f4196a7b07a91a96ce730
    _SOURCE_REALTIME_TIMESTAMP=1651515251634017
Mon 2022-05-02 15:14:11.656875 -03 [s=54677f9d50e54de79146a6d96eddd5d3;i=dbe;b=7847eb41c0ef46eeb98aab83c90091c7;m=5457cb2b5;t=5de0b5bea88c6;x=6c97e2c69c2188c5]
    PRIORITY=6
    SYSLOG_FACILITY=3
    CODE_FILE=../src/core/unit.c
    CODE_LINE=5487
    CODE_FUNC=unit_log_success
    SYSLOG_IDENTIFIER=systemd
    MESSAGE_ID=7ad2d189f7e94e70a38c781354912448
    UNIT=screenMonitor.service
    MESSAGE=screenMonitor.service: Succeeded.
    _TRANSPORT=journal
    _PID=1
    _UID=0
    _GID=0
    _COMM=systemd
    _EXE=/usr/lib/systemd/systemd
    _CMDLINE=/sbin/init
    _CAP_EFFECTIVE=3fffffffff
    _SELINUX_CONTEXT=unconfined
    _SYSTEMD_CGROUP=/init.scope
    _SYSTEMD_UNIT=init.scope
    _SYSTEMD_SLICE=-.slice
    _BOOT_ID=7847eb41c0ef46eeb98aab83c90091c7
    _MACHINE_ID=279c8612447944b6925e3f6aa4adf4b8
    _HOSTNAME=test
    INVOCATION_ID=40e5dd06027f4196a7b07a91a96ce730
    _SOURCE_REALTIME_TIMESTAMP=1651515251656875

答案1

要查看更详细的输出,journalctl您可以使用:

  1. journalctl -o verbose
  2. journalctl -o json-pretty

要另外将日志输出过滤到特定服务,请使用:

  1. journalctl -u screenMonitor.service -o verbose
  2. journalctl -u screenMonitor.service -o json-pretty

相关内容