Strace守护程序进程已开始使用服务

时间:2018-03-08 09:56:41

标签: system-calls systemd strace

通过传递过程命令,可以将Strace用于跟踪过程,如下所示

strace -f -tt -o strace.log -D <SOME_COMMAND>

但是以下命令无法跟踪已启动的守护程序进程的系统调用

strace -f -tt -o strace.log -D service nginx start

在这种情况下,strace只跟踪/usr/sbin/service的系统调用并终止。它不跟踪由nginx

开始的service nginx start进程上的系统调用

如何跟踪/usr/sbin/service开始的流程?专门寻找只有守护进程的解决方案!

2 个答案:

答案 0 :(得分:1)

而不是从服务运行nginx。运行service nginx stop然后运行

strace nginx -g "daemon off;"

这将确保您获得该过程的跟踪。 -g "daemon off;"将确保nginx不作为守护进程运行,否则strace将结束

服务命令只是激活一个流程,如果你想strace,最好是直接启动流程。

如果您仍然对调试使用service命令启动的进程感兴趣。然后在下面

service nginx start
ps aux | grep nginx

从nginx进程中捕获pid,然后使用

附加到它
strace -p <pid>

分叉流程

要跟踪fork的进程,需要使用-f标志

strace -f nginx

服务追踪

当您致电service start nginx时,假设系统使用systemd,则呼叫将转换为systemctl start nginx。现在,如果你看一下systemd

的源代码

https://github.com/systemd/systemd/blob/cf45dd36282368d5cdf757cac2cf1fc2b562dab2/src/systemctl/systemctl.c#L3100

r = sd_bus_call_method_async(
    bus,
    NULL,
    "org.freedesktop.systemd1",
    "/org/freedesktop/systemd1",
    "org.freedesktop.systemd1.Manager",
    "Subscribe",
    NULL, NULL,
    NULL);

它不会产生/分叉进程。它将消息发送到systemd服务,然后启动nginx进程。

简而言之,你无法完成service nginx start命令。

答案 1 :(得分:0)

更改服务的ExecStart属性以包括“ strace”。例如(在Debian Buster上测试):

# grep ExecStart /lib/systemd/system/nginx.service
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
# cd /etc/systemd/system/
# mkdir nginx.service.d
# cat > nginx.service.d/strace.conf <<-EOD
    [Service]
    ExecStart=
    ExecStart=/usr/bin/strace -f -tt -o /tmp/strace.log -D /usr/sbin/nginx -g 'daemon on; master_process on;'
EOD
# systemctl daemon-reload
# systemctl restart nginx.service