想知道node-health-monitor在哪里退出了,要查看日志。一读代码发现所有日志都是用DLT_LOG输出的,syslog默认位置/var/log下看不到任何有用的日志。于是搜索如何查看dlt日志,how to view dlt log,查到可以使用dlt-viewer查看DLT日志 。
该组件作用是通过SSH连接ECU,可视化呈现ECU上所有通过DLT输出的日志,如下图:

该组件为开源软件,可通过源代码编译后使用。参考文档:
https://pelux.io/software-factory/master/swf-blueprint/docs/articles/sdk/read-system-logs.html 源代码:
https://github.com/COVESA/dlt-viewer

dlt-viewer日志分析
 首先映入眼帘的是nhm在请求pas服务时被拒绝,systemctl status pas-daemon发现该服务压根没启动。
 systemctl enable pas-daemon启用服务后还是不行。
 分析dlt-viewer日志发现:
 ERROR1
 pas服务在获取DBUS name时失败了。
 查看nodestatemanager-daemon服务的配置文件,大致在如下四个位置:
 /lib/systemd/system/nodestatemanager-daemon.service其中针对dbus配置的行:
 BusName=org.genivi.NodeStateManager
 /etc/dbus-1/system.d/org.genivi.NodeStateManager.conf该文件用于定义dbus总线的归属、目的地及接口。
 其中:

 需要跟代码中g_bus_own_name函数传入的bus name匹配。

 一般跟own的值一致。

 定义interface,取值与下面文件中的接口相一致:
 /usr/share/dbus-1/interfaces/org.genivi.NodeStateManager.LifecycleConsumer.xml另外还有两个接口定义文件,但不知道为什么不需要/etc/dbus-1/system.d/下没有对应的conf
 /usr/share/dbus-1/interfaces/org.genivi.NodeStateManager.LifecycleControl.xml
 org.genivi.NodeStateManager.LifecycleControl.xml
 /usr/share/dbus-1/system-services/org.genivi.NodeStateManager.LifeCycleControl.service[D-BUS Service]
 Name=org.genivi.NodeStateManager
 SystemdService = nodestatemanager-daemon.service
 Exec=/bin/false
 该文件用于定义dbus服务名及对应的systemd服务名和启动命令行。注意Name要与system服务service文件中定义的 BusName 匹配。根据以上信息,结合persistence-admin源代码中的dbus配置文件,手动添加如下文件:
 /etc/dbus-1/system.d/org.genivi.persistence.admin.conf
 /usr/share/dbus-1/system-services/org.genivi.persistence.admin.service
 同时在/lib/systemd/system/pas-daemon.service中添加:
 BusName=org.genivi.persistence.admin
 重启发现pas-daemon服务起来了,但node-health-monitor服务仍然没有起来。
 继续查看dlt-viewer日志发现:
 ERROR2
 node-health-monitor服务也获取DBUS name失败。
 按照解决ERROR1的方法对node-health-monitor进行dbus配置,结果不好用。
 看node-health-monitor源代码发现,其使用的dbus类型为2,即session dbus,而之前的nodestatemanager-daemon和pas-daemon服务使用的dbus类型都是1,system dbus。
 结果及总结
 经过搜索system dbus和session dbus的区别和各自的配置方法,以及多番尝试,最后得出如下结论:1. 服务service文件
 使用system dbus的服务,其服务service文件存放在/lib/systemd/system下
 使用session dbus的服务,其服务service文件存放在/etc/systemd/user和/lib/systemd/system两个位置,/etc/systemd/user下的service文件可以是软链接指向/lib/systemd/system下对应的服务service文件2. dbus配置文件
 使用system dbus的服务,其dbus配置文件存放在/etc/dbus-1/system.d/
 使用session dbus的服务,其dbus配置文件存放在/etc/dbus-1/session.d/3. dbus服务service文件
 使用system dbus的服务,其dbus服务service文件存放在/usr/share/dbus-1/system-services/
 使用session dbus的服务,其dbus服务service文件存放在/usr/share/dbus-1/services/4. 服务启用命令
 使用system dbus的服务,启用服务的命令为systemctl enable xxx.service
 使用session dbus的服务,启用服务的命令为systemctl --user enable xxx.service5. 服务状态查看
 使用system dbus的服务,查看服务状态的命令为systemctl status xxx.service
 使用session dbus的服务,查看服务状态的命令为systemctl --user status xxx.service
 第四点尤为重要,因为没有注意到这一点卡了三四天,直到在启用服务时加了–user,才终于把node-health-monitor服务启动起来。
 执行:
 ps -e | grep -i dbus
 会发现有两个dbus-daemon:
 dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
 dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
 第一个由/lib/systemd/system/dbus.service服务启动
 第二个由/usr/lib/systemd/user/dbus.service服务启动
 依赖于dbus的服务在service文件中定义require和after的时候都添加dbus.service,系统会根据服务对应的dbus服务类型(system或session)自动匹配对应目录下的dbus.service。