실행 중인 경우 cron 명령이 세션 버스에 액세스할 수 있도록 하려면 무엇이 필요합니까?
systemd로 전환한 이후 최근(아마도 한두 달 전)까지 Debian Stretch(테스트)에서 저에게 효과적이었습니다. 이상하게도 이것이 PAM 구성에 의해 제어되는 것이라고 강하게 의심되는 반면, /etc/pam.d
최근의 유일한 변경 사항은 일부 pam_selinux
쌍이 추가된 것입니다 pam.d/systemd-user
.
그러면 무엇을 찾아야 합니까?
답변1
DBUS_SESSION_BUS_ADDRESS
이는 환경 변수가 cron 환경에 전파되지 않기 때문일 수 있습니다 .
적어도 Gnome에서는 버스가 "검색 가능"하지 않습니다(문서의 "자동 시작" 섹션에 명시된 대로).dbus-launch(1)
매뉴얼 페이지) 파일을 통해 $HOME/.dbus/session-bus
. 이로 인해 crontab에서 실행 중인 모든 항목이 $DBUS_SESSION_BUS_ADDRESS
D-Bus 세션을 찾아 연결하는 것이 불가능해집니다.
나는 참조되는 실제 파일의 사용 $HOME/.dbus
이나 존재 로 인해 과거에 작동했다는 귀하의 말을 받아들입니다 (보통 와 같은 설정 ). 매뉴얼 페이지에서는 다음과 같이 설명합니다./tmp/dbus-$TMPNAM
$DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-GkJdpPD4sk,guid=0001e69e075e5e2
dbus-cleanup-sockets(1)
Linux에서는 D-Bus가 기본적으로 메모리에만 존재하고 /tmp에 해당 파일이 없는 "추상 소켓"을 사용하기 때문에 이 프로그램은 본질적으로 쓸모가 없습니다.
그러나 우분투 포럼 게시물에서 제안된 아이디어의 변형을 사용할 수 있습니다.SSH를 통해 기존 DBUS 세션에 연결, cron 환경에서 로컬 머신의 기존 사용자 세션에 대한 세션 D-Bus를 검색하고 그에 $DBUS_SESSION_BUS_ADDRESS
따라 설정합니다.
nautilus
여기에 사용된 기술은 pulseaudio
일반적으로 실행되는 프로세스(예: , 및 )에서 환경을 검색하고 trackerd
해당 프로세스 중 하나 이상이 활성 세션에서 실행되어야 하지만 보다 기본적인 접근 방식을 권장합니다.
모든 일반 데스크탑 환경 세션 관리자( gnome-session
, lxsession
및 )는 이전에 시작되었고 더 낮은 PID를 가졌 더라도 해당 환경에 kded4
이미 설정되어 있습니다 . 따라서 데스크탑 환경에 해당하는 세션 관리자를 사용하는 것이 가장 합리적입니다.$DBUS_SESSION_BUS_ADDRESS
dbus-daemon
$HOME/bin/test-crontab-dbus.sh
기존 세션 버스에 대한 액세스를 테스트하기 위해 내부에 다음 스크립트를 작성했습니다 .
#!/bin/sh
SESSION_MANAGER=lxsession
OUTFILE=/tmp/${USER}-cron-dbus.txt
export $(cat /proc/$(pgrep "$SESSION_MANAGER" -u "$USER")/environ \
|egrep -z '^DBUS_SESSION_BUS_ADDRESS=')
date >> $OUTFILE
dbus-send --session --dest=org.freedesktop.DBus \
/ org.freedesktop.DBus.GetId 2>> $OUTFILE
if test "$?" -eq 0; then
echo "Success contacting session bus!" >> $OUTFILE
fi
위의 내용은 SESSION_MANAGER=lxsession
LXDE에서 실행되는 기본 데스크톱 세션, 설정한 Gnome SESSION_MANAGER=gnome-session
및 사용 중인 KDE에서 적용됩니다 SESSION_MANAGER=kded4
.
crontab의 작업이 세션 버스에 액세스할 수 있는 경우 출력에 다음과 유사한 내용이 표시됩니다.
Fri Dec 18 15:27:02 EST 2015
Success contacting session bus!
그렇지 않으면 오류 메시지가 인쇄됩니다 dbus-send
.
분명히 cron 작업을 통해 실제로 수행해야 하는 모든 작업을 포함하여 세션 버스 연결을 테스트하는 다른 방법을 대체할 수 있습니다.