dbus와 KDE · 6 min read · Jan 03, 2026
dbus와 KDE의 통합: KDM으로 dbus의 세션 부분 시작 및 중지
dbus와 KDE의 통합: KDM으로 dbus의 세션 부분 시작 및 중지.
목차
- 소개
- KDM 구성 조정
- dbus의 세션 데몬 시작 및 환경 변수 사용 가능하게 만들기.
2.1 Bash의 시작 파일에 대하여.
2.2 dbus의 세션 버스 부분 시작
2.3 dbus의 세션 버스 부분 중지
2.4 한 사용자가 여러 번 로그인한 경우
0. 소개
최근 많은 애플리케이션이 D-BUS를 사용하고 있습니다. 이는 KDE 3.5, 현재 안정적인 KDE 릴리스에서 발생합니다. 다가오는 KDE 4에서는 D-BUS가 더 중요해지며, DCOP를 대체합니다.
이 방법에서는 dbus의 사용자 및 세션 종속 부분을 시작하고 중지하는 방법을 설명하고자 합니다. 이 접근 방식에서 염두에 두고 있는 주요 목표는 다음과 같습니다:
- d-bus를 인식하는 애플리케이션에 중요한 환경 변수를 사용할 수 있도록 하기;
- 단일 사용자에 대해 dbus 세션 부분이 한 번 이상 시작되지 않도록 하기;
- 사용자의 세션이 종료될 때 dbus 세션 부분이 중지되도록 하기;
사용자가 KDE 3.5의 로그인 관리자 KDM으로 로그인한다고 가정합니다. 이 구조는 다른 로그인 관리자(XDM, GDM)와도 잘 작동할 수 있습니다.
KDM은 세션 시작 시(시작 시) 및 종료 시(재설정 시) 스크립트를 실행할 수 있는 기능을 가지고 있습니다. 그 중 하나가 dbus 세션 부분을 시작(및 중지)할 수 있습니다.
1. KDM: 파일들
KDM은 시작 및 중지를 위해 몇 가지 파일을 사용합니다:
. Xstartup
사용자가 성공적으로 로그인한 후 root로 실행됩니다.
. Xsession
인증된 사용자의 권한으로 실행되어 원하는 세션(KDE)을 시작합니다.
. Xreset
사용자 세션이 종료된 후 root로 실행됩니다.
Xstartup은 시작할 장소이고, Xreset은 이러한 명령을 취소할 장소입니다.
이 파일들에 대한 더 많은 정보는 KDM의 설명서를 참조하십시오.
다음 코드를 Xstartup 파일에 추가합니다:
-- snip --
for script in /etc/session.d/kdm/startup/*.sh; do
if [ -x $script ]; then
eval $script $USER kdm
fi;
done;그리고 Xreset 파일에 다음 코드를 추가합니다:
-- snip --
for script in /etc/session.d/kdm/reset/*.sh; do
if [ -x $script ]; then
eval $script $USER kdm
fi;
done;스크립트가 들어갈 디렉토리를 생성합니다:
install -m755 -d /etc/session.d/kdm/startup
install -m755 -d /etc/session.d/kdm/reset
install -m755 -d /etc/session.d/scripts/start
install -m755 -d /etc/session.d/scripts/stop이 디렉토리의 파일은 모든 일반 사용자가 접근할 수 있어야 하므로 권한은 755입니다.
이 디렉토리의 모든 스크립트는 동일한 권한을 가져야 합니다: 755.
모든 사용자는 스크립트를 실행할 수 있어야 하지만, 오직 root만이 이를 수정할 수 있습니다.
1. dbus의 세션 데몬 시작 및 환경 변수 사용 가능하게 만들기
dbus 패키지는 두 부분으로 나뉩니다: 하나는 시스템 전체에 대한 부분이고, 다른 하나는 (각) 세션/사용자에 대한 부분입니다. 시스템 전체에 대한 부분(데몬)은 부팅 시 특별한 권한을 가진 전용 사용자로 시작됩니다. 세션 전체에 대한 부분(또한 데몬)은 사용자의 세션이 시작될 때 시작되어야 하며, 세션이 종료될 때 중지되어야 합니다.
여기서 사용하는 kdm의 구조는 이를 위해 이상적입니다. 사용자를 위한 세션 데몬을 시작하는 스크립트가 시작 디렉토리에 있고, 그 데몬을 중지하는 다른 스크립트가 재설정 디렉토리에 있어야 합니다.
하지만 그렇게 간단하지는 않습니다. 일부 변수(DBUS_SESSION_BUS_ADDRESS 및 DBUS_SESSION_BUS_PID)는 dbus와 함께 작동하는 모든 애플리케이션의 환경에서 사용 가능해야 합니다. 제 생각에는 이러한 변수의 설정이 bash 시작 스크립트에 포함되어야 합니다. 그러면 어떤 스크립트나 애플리케이션을 실행하든지 이 변수들은 올바른 값으로 설정됩니다.
1.1 Bash의 시작 파일에 대하여
dbus의 세션 데몬은 환경 변수를 포함하는 파일을 생성합니다. 위에서 언급한 바와 같이 이 파일은 bash가 이 사용자에 대해 시작될 때 읽혀야 합니다.
bash가 “login”에 의해 대화형 로그인 셸로 시작될 때, /etc/profile 및 ~/.bash_profile을 읽습니다. bash는 또한 “kdm”에 의해 시작되며, /etc/profile 및 ~/.bash_profile 파일이 소스됩니다.
제 생각은 다음 명령의 출력을
dbus-launch --auto-syntax$HOME/.dbus-session 파일에 저장하는 것입니다.
이 파일은 bash가 시작될 때 “소스”됩니다. 이는 자동으로 발생하지 않으므로, 다음 스크립트를 /etc/profile.d에 추가해야 합니다:
cat >> /etc/profile.d/dbus-session.sh << "EOF"
if [ -f $HOME/.dbus-session ]; then
. $HOME/.dbus-session
fi;
EOF이렇게 하면 Bash가 시작될 때 환경 변수가 사용 가능해집니다.
1.2 dbus의 세션 버스 부분 시작
dbus가 설치되어 있고 부팅 시 시작된다고 가정합니다.
/etc/session.d/scripts/start 디렉토리에 dbus-session-start.sh 스크립트를 생성합니다:
cd /etc/session.d/scripts/start
cat >> dbus-session-start.sh << "EOF"
#!/bin/bash
retcode=0;
userid=$1
userproperties=$(getent passwd | grep -m 1 -E "^$userid")
homedir=$(echo $userproperties | cut -d ":" -f 6);
gidnr=$(echo $userproperties | cut -d ":" -f 4);
uidnr=$(echo $userproperties | cut -d ":" -f 3);
if [ -d $homedir ]; then
#
# dbus-daemon이 이미 실행 중인지 확인합니다
# dbus-daemon은 로그인하는 사용자(uidnr)에 의해 시작되어야 합니다
#
if [ -f $homedir/.dbus-session ]; then
# 이 사용자의 dbus-daemon이 .dbus-session 파일의 pid로 실행 중인지 확인합니다
# ps 명령에 따른 pid
ps_dbus_session_pid=$(ps aux | grep -m 1 -E "^$userid.*dbus-daemon.*session.*"
| grep -v "grep" | sed 's@[[:space:]][[:space:]]*@ @g' | cut -d " " -f 2)
# .dbus-session 파일에서 pid 읽기
. $homedir/.dbus-session
# 동일한지 확인
if [ -z "$ps_dbus_session_pid" ]; then
# 이 사용자의 dbus가 실행 중이지 않음
rm $homedir/.dbus-session
elif [ $DBUS_SESSION_BUS_PID -ne $ps_dbus_session_pid ]; then
# 문제가 발생했습니다: 이 사용자의 dbus-daemon을 중지하고 .dbus-session 파일을 제거합니다
if [ $(id -u) -eq 0 ]; then
sudo -H -u $userid sh -c "kill $ps_dbus_session_pid"
elif [ $(id -u) -eq $uidnr ]; then
kill -SIGTERM $ps_dbus_session_pid;
fi
rm $homedir/.dbus-session
fi
fi
if [ ! -f $homedir/.dbus-session ]; then
# .dbus-session 파일이 사용자의 홈 디렉토리에 없을 경우에만 dbus 세션을 시작합니다
if [ $(id -u) -eq 0 ]; then
sudo -u $userid -H /bin/sh -c "dbus-launch --auto-syntax > $homedir/.dbus-session"
retcode=$?
chown $uidnr:$gidnr $homedir/.dbus-session
elif [ $(id -u) -eq $uidnr ]; then
dbus-launch --auto-syntax > $homedir/.dbus-session
retcode=$?
fi
fi
fi;
if [ $retcode -ne 0 ]; then
echo "dbus에 오류가 발생했습니다 ($retcode)."
fi;
exit $retcode
EOF
chmod --verbose --mode 755 /etc/session.d/scripts/start/dbus-session-start.sh
ln -v -sf ../../scripts/start/dbus-session-start.sh /etc/session.d/kdm/startup/10dbus.sh이 스크립트는 KDM에 의해 시작될 때 사용자의 dbus 세션 데몬을 시작하고, 이 사용자의 홈 디렉토리에 모든 dbus 변수를 포함하는 .dbus-session 파일을 생성합니다.
이 스크립트는 사용자의 dbus가 이미 실행 중이지 않을 때만 수행됩니다.
이제 bash가 로그인 시 시작될 때 이 파일을 읽습니다(소스합니다).
보시다시피, dbus의 시작을 두 부분으로 나누었습니다:
- dbus-session-start.sh는 (kdm) 세션이 시작될 때 실행됩니다
- .dbus-session은 (bash) 세션이 시작될 때 소스되며, 여러 번 소스될 수 있습니다
또한, –auto-syntax 매개변수를 사용하며, 여기서는 Bash가 사용된다고 가정합니다. 따라서 –sh-syntax를 사용할 수 있지만, 잘 작동합니다.
그리고 KDM이 이 스크립트를 root로 실행하기 때문에, 로그인하는 사용자의 권한으로 dbus-launcher를 실행하기 위해 sudo가 필요합니다. (실제로 이 스크립트는 이 스크립트를 실행하는 계정의 id를 확인합니다. root(id = 0)인 경우 sudo를 사용하여 세션을 시작하는 사용자로 변경합니다. id와 로그인하는 사용자의 id가 동일하면 아무 작업도 수행할 필요가 없습니다.
2.3 dbus의 세션 버스 부분 중지
재설정 디렉토리에 dbus-session-stop.sh 스크립트를 생성합니다:
cd /etc/session.d/scripts/stop
cat >> dbus-session-stop.sh << "EOF"
#!/bin/bash
retcode=0;
userid=$1
userproperties=$(getent passwd | grep -m 1 -E "^$userid")
homedir=$(echo $userproperties | cut -d ":" -f 6);
gidnr=$(echo $userproperties | cut -d ":" -f 4);
uidnr=$(echo $userproperties | cut -d ":" -f 3);
if [ -f $homedir/.dbus-session ]; then
. $homedir/.dbus-session
if [ -n "$DBUS_SESSION_BUS_PID" ]; then
if [ $(id -u) -eq 0 ]; then
sudo -u $userid -H /bin/sh -c "kill $DBUS_SESSION_BUS_PID"
retcode=$?
rm $homedir/.dbus-session
elif [ $(id -u) -eq $uidnr ]; then
kill $DBUS_SESSION_BUS_PID
retcode=$?
rm $homedir/.dbus-session
fi
fi
fi;
if [ $retcode -ne 0 ]; then
echo "dbus에 오류가 발생했습니다 ($retcode)."
fi;
exit $retcode
EOF
chmod --verbose --mode 755 dbus-session-stop.sh
ln -v -sf ../../scripts/stop/dbus-session-stop.sh /etc/session.d/kdm/reset/90dbus.sh이 스크립트는 dbus-daemon의 세션 부분을 중지합니다.
2.4 한 사용자가 여러 번 로그인한 경우
대부분의 상황에서 이 구조는 충분합니다. 대부분의 사용자는 한 번에 하나의 세션을 가지고 있습니다. 이제 사용자가 동시에 여러 세션을 가지고 있을 때는 어떻게 될까요? 각 세션에 대해 dbus의 세션 부분을 시작해야 할까요, 아니면 하나의 인스턴스면 충분할까요?
이 구조는 사용자당 하나의 dbus-daemon만 허용합니다. 저는 이것이 충분하다고 생각합니다.
변경 로그:
[2006-01-18]
- 초기 방법
[2006-07-18] - bash 스크립트 변경
[2006-09-09] - 이 사용자의 dbus-daemon이 이미 실행 중인지 확인하고 .dbus-session에서 찾은 정보가 올바른지 확인하는 체크 추가
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.