gpt4 book ai didi

system-calls - 使用服务启动 Strace 守护进程

转载 作者:行者123 更新时间:2023-12-02 01:03:25 25 4
gpt4 key购买 nike

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 启动的进程?专门寻找只有守护进程的解决方案!

最佳答案

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

strace nginx -g "daemon off;"

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

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

如果您仍然对调试使用 service 命令启动的进程感兴趣。然后在下面做
service nginx start
ps aux | grep nginx

捕获 pid从 nginx 进程,然后使用附加到它
strace -p <pid>

fork 进程

要跟踪哪个 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);

它不会产生/ fork 该过程。它将消息发送到 systemd 服务,然后启动 nginx过程。

简而言之, 你不能通过你的 service nginx start命令。

关于system-calls - 使用服务启动 Strace 守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49170217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com