通过传递过程命令,可以将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
开始的流程?专门寻找只有守护进程的解决方案!
答案 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
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