ฉันมีภูตที่ถูกนำไปใช้ในการทุบตีและทำงานโดยวิธีการ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 ก็เพียงพอแล้ว
lightdm