如何在启动时“strace” systemd 服务?

如何在启动时“strace” systemd 服务?

我正在开发一个运行精简版 Ubuntu 22.04 的嵌入式系统。我们最近更新了嵌入式系统中的一些硬件,我正在努力让我们的 Ubuntu 映像在新硬件上运行。

在旧硬件上,pulseaudio 服务始终运行正常,但在新硬件上,我遇到了一个问题,即在引导期间启动服务时,pulseaudio 无法检测到 Alsa 卡 0。如果我通过重新启动服务,systemctl --user restart pulseaudio.service它就会检测到 Alsa 卡 0,一切正常。

我怀疑 pulseaudio 正在检查中是否存在字符设备,/dev/snd/或者中是否存在文件/文件夹/proc/asound/,但它正在寻找的设备或文件尚不存在,而是由正在加载的内核模块稍后创建的。

为了验证我的怀疑,我尝试在启动期间对服务运行 strace。我更新了 /usr/lib/systemd/user/pulseaudio.service 并更改了 ExecStart 行,如下所示:

ExecStart=strace -e trace=file -o /home/user/trace_erronly_fail.log -Z -f -tt /usr/bin/pulseaudio --daemonize=no --log-target=journal --log-level=debug

运行后systemctl --user daemon-reload,我尝试启动服务以测试 strace 是否可以正常工作,但服务启动失败。服务状态报告如下:

x pulseaudio.service - Sound Service
     Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; enabled; vendor preset: enabled)
     Active: failed (Result: core-dump) since Wed 2023-04-19 12:33:21 UTC; 2s ago
TriggeredBy: x pulseaudio.socket
    Process: 1673 ExecStart=strace -e trace=file -o /home/user/trace_erronly_fail.log -Z -f -tt /usr/bin/pulseaudio --daemonize=no --log-target=journal --log-level=debug (code=dumped, signal=SYS)
   Main PID: 1673 (code=dumped, signal=SYS)
        CPU: 49ms

Apr 19 12:33:21 Ubuntu-V8 systemd[780]: pulseaudio.service: Scheduled restart job, restart counter is at 5.
Apr 19 12:33:21 Ubuntu-V8 systemd[780]: Stopped Sound Service.
Apr 19 12:33:21 Ubuntu-V8 systemd[780]: pulseaudio.service: Start request repeated too quickly.
Apr 19 12:33:21 Ubuntu-V8 systemd[780]: pulseaudio.service: Failed with result 'core-dump'.
Apr 19 12:33:21 Ubuntu-V8 systemd[780]: Failed to start Sound Service.

似乎它正在发出一个 SIGSYS 信号,据说man 7 signal当出现错误的系统调用时就会发出该信号。

我不太清楚为什么会出现这个问题。我可以手动运行 ExecStart 命令,而不会发出 SIGSYS 信号,因此只有当它作为 systemd 服务运行时才会发出该信号。

那么,当作为 systemd 服务运行时,如何让 strace 正常工作?

答案1

事实证明,systemd 服务有一个允许的系统调用列表。如果服务尝试执行不允许的系统调用,则该进程将通过 SIGSYS 信号终止。

要告诉 systemd 允许进程执行任何系统调用,您需要更新 .service 文件并在该[Service]部分下添加以下内容:

SystemCallFilter=@known

然后,只需执行一个systemctl --user daemon-reload后跟systemctl --user start pulseaudio.service(对于系统服务,省略--user),它就会立即启动。

有关 SystemCallFilter 参数的更多信息,请参阅man 5 systemd.exec

相关内容