【问题标题】:Strace daemon process started using service使用服务启动 Strace 守护进程
【发布时间】:2018-08-16 15:15:15
【问题描述】:

Strace 可用于跟踪进程,通过以下命令传递进程

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

但下面的命令无法跟踪启动的守护进程的系统调用

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

在这种情况下,strace 只是跟踪/usr/sbin/service 的系统调用并终止。它不会跟踪由于service nginx start 而启动的nginx 进程上的系统调用

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

【问题讨论】:

    标签: system-calls systemd strace


    【解决方案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>
    

    分叉进程

    要跟踪哪个分叉的进程,您需要使用-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 进程。

    简而言之,NO您无法浏览您的service nginx start 命令。

    【讨论】:

    • 我正在专门寻找开启守护进程的解决方案!否则它就直截了当!
    • 我已经用过-f了。我正在寻找答案的原因是我可以正确追踪service XYZ start
    • 谁投反对票,请解释投反对票的原因以及答案有什么问题
    【解决方案2】:

    将服务的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2012-01-13
      相关资源
      最近更新 更多