วิธีการตรวจจับจากสคริปต์เมื่อโหลดเดสก์ท็อปของผู้ใช้


11

ฉันมีภูตที่ถูกนำไปใช้ในการทุบตีและทำงานโดยวิธีการcronและ@rebootตัวเลือกที่แสดงให้เห็นว่าเดสก์ท็อปไม่มีการใช้งาน สคริปต์มีดังต่อไปนี้ (กำหนดเวลาสั้น ๆ สำหรับการทดสอบ):

#!/bin/bash
P_STATE=0
while :
do
    sleep 5
    if [ $P_STATE == 0 ]; then
         [ `xprintidle` -ge 25000 ] && P_STATE=1 && wmctrl -k on
    else
         [ `xprintidle` -le 25000 ] && P_STATE=0
done

ปัญหา: หากผู้ใช้ยังอยู่ในหน้าจอเข้าสู่ระบบxprintidleและwmctrlล้มเหลวเนื่องจากเดสก์ท็อปยังไม่โหลด เพื่อหลีกเลี่ยงสิ่งนี้ฉันได้ใส่บรรทัดถัดไปไว้ที่จุดเริ่มต้นของสคริปต์:

while:
do
    sleep 10s
    [ -n `who | grep "$USER"` ] && break
done

ดังนั้นสคริปต์จะรอผู้ใช้ (ตัวแปร USER ถูกตั้งค่าเป็นชื่อผู้ใช้ของฉันในไฟล์ crontab) ถูกบันทึกไว้ แต่มันเริ่มต้นโดยผู้ใช้ตัวอย่างเช่นเทอร์มินัลเซสชัน (ไม่ใช่เซสชันกราฟิกเช่น KDE หรือ GNOME) สคริปต์ก็ดำเนินการต่อ

ฉันจะทราบได้อย่างไรว่าผู้ใช้อยู่ในช่วง "กราฟิก" ที่สามารถ "แสดงโหมดเดสก์ท็อป" ได้หรือไม่? ยิ่งไปกว่านั้นฉันจะมั่นใจได้อย่างไรว่าเซสชัน "กราฟิก" ถูกโหลดอย่างสมบูรณ์และไม่อยู่ในขั้นตอนการโหลดหรืออะไรทำนองนั้น

โซลูชันของฉัน: โซลูชัน ของฉัน (ไม่เป็นทางการ) กำลังเพิ่มในลูปหลักของgrepบรรทัด:

WAIT_TIME=180

while:
do
    sleep $WAIT_TIME

    [ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue

    ## My actions here
done

เป็น "$ WM_CMD" เป้าหมายคำสั่งผู้จัดการหน้าต่าง ฉันคิดว่าถ้าคำสั่ง windows managerทำงานในระบบก็หมายความว่าเดสก์ท็อปจะถูกโหลดอย่างสมบูรณ์และคำสั่ง "กราฟิก" ใด ๆ แน่ใจ

ตัวแปร WM_CMD ถูกกำหนดไว้ที่ไหน? ในcrontabบรรทัด:

 @reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null

แต่ฉันก็คิดว่ามันเป็นไปได้ที่จะตรวจจับ "คำสั่ง windows manager" โดยการร้องขอระบบอื่น ๆ อย่างไรก็ตามสำหรับฉันกำหนด WM_CMD ในไฟล์ crontab ก็เพียงพอแล้ว


คุณใช้ตัวจัดการการเข้าสู่ระบบอะไร
mtahmed

ผู้จัดการการเข้าสู่ระบบของฉันคือlightdm
Peregring-lk

คำถามผู้ใช้ขั้นสูงนี้อาจช่วยคุณได้ ฉันไม่แน่ใจว่ามันจะตอบคำถามของคุณอย่างสมบูรณ์แม้ว่า
Rany Albeg Wein

1
มันไม่ได้เป็นที่แข็งแกร่งโดยเฉพาะอย่างยิ่ง แต่คุณสามารถตรวจสอบกระบวนการ Gnome / KDE ...
jasonwryan

1
คุณควรบันทึกสิ่งที่คุณทำไว้เป็นคำตอบ มันอาจช่วยเหลือผู้อื่น
jasonwryan

คำตอบ:


2

ลองใช้ D-Bus เพื่อค้นหาข้อมูลเซสชันจากlogindบริการ มันมีorg.freedesktop.login1.Managerอินเตอร์เฟซที่มีสัญญาณหลายอย่างและSessionNew และอินเตอร์เฟส มันสามารถช่วยในการรับสถานะ / ที่นั่ง / ผู้ใช้SeatNeworg.freedesktop.login1.Seatorg.freedesktop.login1.User


1

ใช้สคริปต์เริ่มต้นเซสชันการเข้าสู่ระบบ~/.xprofileเพื่อสร้างไฟล์แฟล็กสำหรับคุณ ไม่ว่าจะเป็น~/.xlogin_flagจากนั้นในสคริปต์อื่น ๆ ของคุณใช้inotifywatchจากแพ็คเกจinotify-toolsเพื่อดูว่ามันถูกสร้างขึ้นแตะหรือลบ


1

ตรวจสอบผลลัพธ์ของwคำสั่ง คุณจะเห็นประเภทล็อกอิน (X display) ในฟิลด์ล็อกอิน @


1

ฉันคิดว่าวิธีที่ง่ายที่สุดในการตรวจสอบว่าผู้ใช้เชื่อมต่อใน X11 คือการตรวจสอบกระบวนการที่เขียนถึง$HOME/.xsession-errorsตั้งแต่เมื่อคุณเข้าสู่ระบบแบบกราฟิกสิ่งที่คุณ stderr ทั้งหมดจะถูกเปลี่ยนเส้นทางที่นั่น

มิฉะนั้นเพียงแค่ใช้wคำสั่งตามที่แนะนำโดย @Grzegorz: ถ้าFROMคอลัมน์เริ่มต้นด้วย:แล้วมันเป็นเซสชั่นกราฟิก


0

ตรวจสอบในไดเรกทอรีรันไทม์ของ lightdm บน Arch ด้วย systemd และ lightdm เมื่อผู้ใช้ล็อกอินไฟล์ xauthority จะถูกสร้างขึ้น

$ whoami
carl
$ sudo ls -al /run/lightdm/carl
total 4
drwx------ 2 carl    carl     60 Dec 11 19:40 .
drwx--x--x 8 lightdm lightdm 160 Dec 11 19:40 ..
-rw------- 1 carl    carl     55 Dec 11 19:40 xauthority

คุณสามารถทดสอบสิ่งนี้ด้วยสิ่งนี้ในห่วงของคุณในขณะที่

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.