Linux - 残留的dbus-daemon或dbus-launch,如何避免或如何清理?

Linux - 残留的dbus-daemon或dbus-launch,如何避免或如何清理?

文章目录

  • Linux - 残留的dbus-daemon或dbus-launch,如何避免或如何清理?
  • 前言
  • 一、dbus是什么?
  • 二、模拟残留dbus进程
  • 三、根因
  • 四、解决方案
    • 1. 对于交互shell,确保在启动shell进程前启动dbus-run-session
    • 2. 对于非交互式的,直接使用`dbus-run-session -- command`
    • 3. 写一个.bash_logout脚本,来负责bash退出时的dbus进程清理操作
  • 总结
  • 参考资料


前言

远程启动应用并关闭应用后,有残留的dbus进程。这个情况在一般情况下没什么大不了,但在集群调度的环境,残留的任何进程将可能导致调度系统误判job未完成


一、dbus是什么?

移步官网。

二、模拟残留dbus进程

$ emacs
(emacs opens and then close it)

$ ps -ef | grep USER
USER 12467     1  0 11:47 pts/115  00:00:00 dbus-launch --autolaunch e6d5e75b43ed447899e385d217cd827f --binary-syntax --close-stderr
USER  12469     1  0 11:47 ?        00:00:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
USER  12473     1  0 11:47 ?        00:00:00 /usr/libexec/gconfd-2

$ logout
(Waiting  until C-c)

三、根因

这是因为dbus-launch/dbus-daemon仍然是活动的(它们是与父终端分离创建的)。

四、解决方案

首先现将dbus升级到对应版本

  • (RHEL 7) dbus-1.10.24-3.el7
  • (RHEL 6) dbus-1.2.24-9.el6

或更新。

1. 对于交互shell,确保在启动shell进程前启动dbus-run-session

if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
  exec dbus-run-session -- bash
  echo "D-Bus per-session daemon address is: $DBUS_SESSION_BUS_ADDRESS"
fi

这样就保证了shell进程在dbus-run-session下

$ ps f
  PID TTY      STAT   TIME COMMAND
 2075 pts/0    Ss     0:00 dbus-run-session -- bash
 2095 pts/0    Sl     0:00  \_ dbus-daemon --nofork --print-address 4 --session
 2096 pts/0    S      0:00  \_ bash

2. 对于非交互式的,直接使用dbus-run-session -- command

3. 写一个.bash_logout脚本,来负责bash退出时的dbus进程清理操作

# ~/.bash_logout

# Check if we are the "parent" shell in a ssh session
[ "$(cat /proc/$PPID/comm)" == "sshd" ] || return

cgroup=$(awk -F ':' '$2 == "name=systemd" { print $3 }' /proc/self/cgroup)
[ -n "$cgroup" ] || return

# Search for "dbus-[daemon|launch]" programs running for this session

for pid in $(cat /sys/fs/cgroup/systemd/$cgroup/tasks 2>/dev/null); do
    comm=$(cat /proc/$pid/comm 2>/dev/null)
    case "$comm" in
    dbus-daemon|dbus-launch)
        echo "Killing '$comm' (PID $pid) ..."
        kill $pid
        ;;
    esac
done

总结

以上就是bash shell下预防或清理残留dbus进程的现象、原因以及解决方案。如有问题,请留言反馈。

参考资料

https://access.redhat.com/solutions/3257651

你可能感兴趣的:(Linux)