Crontab'da bir dbus programı çalıştırın, OTURUM kimliğini nasıl bilebilirsiniz?


17

Crontab içinde bir program çalıştırmam gerekiyor, ancak program dbus oturum kimliği hakkında nasıl bilebilir? yalnızca oturum yöneticileri tarafından başlatılan programlar için kullanılabilir.

Yanıtlar:


21

Sorun biraz benzer X'in ekranı erişen ve X'in çerez dosyasının konumunu bulmak . (Ayrıca, kullanıcının ekranında bir GUI programı başlatmak istiyorsanız bu sorulara bakın.)

Dbus, oturum adresini içindeki bir dosyada saklar ~/.dbus/session-bus. Dosyasının adını $machine_id-$display_numberburada, $machine_idrasgele oluşturulmuş bir numara olarak saklanır /var/lib/dbus/machine-idve $display_numberX ekran numarası (olup $DISPLAYolan :$display_numberya da :$display_number.$screen_number). Dosya ~/.dbus/session-busbir kabuk tarafından ayrıştırılabilir ve tanımlarını içeren DBUS_SESSION_BUS_ADDRESSve DBUS_SESSION_BUS_PID.

dbus_session_file=~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0
if [ -e "$dbus_session_file" ]; then
  . "$dbus_session_file"
  export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
  dbus-send …
fi

Dbus arka plan programının hala kullanılabilir olduğuna dair bir garanti olmadığına dikkat edin. Kullanıcı oturumu kapatmış olabilir.

Alternatif bir yöntem, masaüstü oturumunda bir işlemin PID'sini bulmak ve ortamından dbus adresini elde etmektir.

export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')

Crontab kök olarak çalışıyorsa ve konsolda oturum açan kullanıcının oturumu ile iletişim kurmak istiyorsanız, bkz. Grafiksel bir programı başka bir kullanıcının masaüstünde root olarak başlatabilir miyim?


2

GNOME oturum yöneticisinin pid'ini biliyorsanız, ortamı /procdosya sisteminden okursunuz.

GNOME_SESSION_PID=<PID_OF_GNOME_SESSION> 
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"

OTURUM kimliğini daha sonra bildir-gönder veya dbus * araçları gibi diğer programlarla kullanın.

Şerefe.


çok etkileyici, aslında KDE4 çalıştırıyorum, bu yüzden plasma-desktopbunun yerine aradım , teşekkürler!
papatya

1
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35

1

Vincenzo'nun cevabı hakkında yorum yapamam , ancak cevabının KDE4'te benim için en uygun olduğunu düşünüyorum.

Yine de komutu biraz değiştirmek zorunda kaldım. Benim için:

ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35

Büyük ADDRESSharflerle uyarı.


0

Evet DBus'un balta oturumu olmalıdır. Daha önceki yanıtlar gibi, 'DBUS_SESSION_BUS_ADDRESS' başlamadan önce bir değere sahip olmalıdır. Ancak, bu değeri oluşturmak için 'dbus-launch' kullanabilirsiniz. Aşağıdaki snippet, crontab adlı bir komut dosyasına konabilir.

if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
  eval `dbus-launch --sh-syntax`
fi
echo "D-Bus daemon address is:"
echo "$DBUS_SESSION_BUS_ADDRESS"

# -E to export DBUS_SESSION_BUS_ADDRESS. Crucial to make DBUS work.
sudo -u <user> -E <program> 

Bu çözümün bir dezavantajı, yazılımınızı durdurduktan sonra oturumun takılmaya başlamasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.