跟踪 systemd 服务的调用者

Posted

技术标签:

【中文标题】跟踪 systemd 服务的调用者【英文标题】:Tracing invoker of a systemd service 【发布时间】:2017-03-16 12:52:49 【问题描述】:

我遇到了 Fedora 24 服务器版中的错误。 Firewalld 服务即使在禁用时也始终启动。然而,在工作站上,它按预期保持禁用状态。

我查了一下,有人也遇到了这个错误: https://bugzilla.redhat.com/show_bug.cgi?id=1371122

根据其中一个cmets,如果其他dbus客户端请求,则可以启动服务。所以我最好的办法是服务器版中的一些其他软件启动 Firewalld,这可能是一个管理程序?不知道。我猜是驾驶舱,所以我用 dnf 删除了它,但不是答案。

我会在写完这篇文章后报告这个错误。我想追踪什么/谁启动了服务。 systemctl list-dependencies 什么也没显示。它说 Firewalld 甚至不是其他单元的依赖项。

【问题讨论】:

有点离题了,但你能澄清一下为什么要禁用firewalld吗?我正在收集用例。 @mattdm 防火墙设置对于安全/私有网络中的服务器(在我的情况下,甚至没有连接到互联网的网络)中的服务器来说是乏味的。技术人员是愚蠢/懒惰的,甚至不知道如何使用 linux。你知道我的意思。 谢谢,但我知道如何屏蔽一个单位。我只是对我可以在 Workstation 上禁用它的事实感到困惑。高度一致,如此简单。 如果你屏蔽它,它不会保持禁用状态吗? @mattdm 确实如此!你想从我这里得到什么?这不是我在这里要问的。 【参考方案1】:

您可以做的事情很少。您的服务可能以 systemd 依赖项启动。很容易弄清楚。只需执行systemd show FIREWALLD.service 并查找WantedBy=RequiredBy=。如果没有人想要您的服务,那么它很可能通过 dbus 激活在 dbus 上启动。您可以运行 busctl 并查看您的服务是否为 dbus 可激活服务。

例如:

org.freedesktop.hostname1- - - (activatable) - -

如果您的服务是通过 dbus 激活启动的,AFAIK,没有简单的方法可以找出这一点 [1]。

您可以做的是,您可以使用systemctl mask 屏蔽 dbus 服务,然后等待来自尝试与您的 FIREWALD 对话的应用程序的错误消息。

[1] - 我需要这些信息并侵入了 dbus 代码。我有一个 1-2 年前工作的补丁。如果需要,请尝试将此补丁应用到 dbus 并重新运行您的系统。

commit e1c687c96c36b7bbf2db33e967741c22fe7007c9
Author: Umut Tezduyar Lindskog <umuttl@axis.com>
Date:   Mon Sep 22 11:13:37 2014 +0200

    log originator of activation requests

diff --git a/dbus/bus/activation.c b/dbus/bus/activation.c
index 149cca8..2a9c0bd 100644
--- a/dbus/bus/activation.c
+++ b/dbus/bus/activation.c
@@ -1788,6 +1788,28 @@ bus_activation_activate_service (BusActivation  *activation,
   if (connection)
     dbus_connection_ref (connection);

+
+
+DBusString loginfo_buf;
+unsigned long pid;
+// When connection is NULL, it is that we are trying to activate systemd
+// dbus[1106]: [system] Umut activation request by ':1.5' '/usr/bin/depd -n '
+// dbus[1106]: [system] Activating systemd to hand-off: service name='com.axis.Event.Switch' unit='dbus-com.axis.Event.Switch.service'
+if (connection != NULL && dbus_connection_get_unix_process_id (connection, &pid) && _dbus_string_init (&loginfo_buf))
+
+  if (_dbus_command_for_pid (pid, &loginfo_buf, 50, NULL))
+  
+    bus_context_log (activation->context,
+                   DBUS_SYSTEM_LOG_INFO, "Umut activation request by '%s' '%s'",
+                   bus_connection_get_name(connection), _dbus_string_get_const_data(&loginfo_buf));
+
+    _dbus_string_free (&loginfo_buf);
+  
+
+
+
+
+

【讨论】:

好点。我应该屏蔽服务并查看日志,看看是什么引起了错误。 或者平庸者可以保持沉默。然后搜索将继续。

以上是关于跟踪 systemd 服务的调用者的主要内容,如果未能解决你的问题,请参考以下文章

在kubernetes中列出一个Service的调用者的最好方法是什么?

GNU gcc/ld - 使用在同一个目标文件中定义的调用者和被调用者包装对符号的调用

FxCop,组成依赖程序集的调用者列表

查找 python 内置函数的调用者

如何知道 ASP.NET 中控制器索引的调用者路由?

在 C++ (Visual Studio) 中查找函数的调用者