三个星期过去了,我仍然没能弄清楚为什么这个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
寻找问题
bash 脚本是否手动运行?是的,这确实会在预期文件夹中创建屏幕截图:
test@test-i3:~$ /usr/share/screenmonitor/screenMonitor.bash
服务是否被触发?并运行成功?是的,日志显示服务正在按预期时间间隔成功运行。
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
您可以使用:
journalctl -o verbose
journalctl -o json-pretty
要另外将日志输出过滤到特定服务,请使用:
journalctl -u screenMonitor.service -o verbose
journalctl -u screenMonitor.service -o json-pretty