Tôi có một trình nền, được triển khai trong bash và chạy bằng phương tiện cron
và @reboot
tùy chọn, cho thấy máy tính để bàn không hoạt động. Kịch bản như sau (thời gian là ngắn cho mục đích thử nghiệm):
#!/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
Sự cố: Nếu người dùng vẫn còn, ví dụ, trong màn hình đăng nhập xprintidle
và wmctrl
không thành công do máy tính để bàn chưa được tải. Để tránh điều này, tôi đã đặt các dòng tiếp theo ở phần đầu của kịch bản:
while:
do
sleep 10s
[ -n `who | grep "$USER"` ] && break
done
Vì vậy, tập lệnh chờ người dùng (biến USER được đặt thành tên người dùng của tôi trong tệp crontab) được ghi lại. Nhưng, người dùng bắt đầu, ví dụ, phiên cuối (và không phải phiên đồ họa như KDE hoặc Gnome), tập lệnh cũng tiếp tục.
Làm cách nào để xác định xem người dùng đã tham gia phiên "đồ họa" có khả năng "hiển thị chế độ máy tính để bàn" hay chưa? Và hơn nữa, làm thế nào tôi có thể đảm bảo rằng một phiên "đồ họa" được tải hoàn toàn và không trong quá trình tải hoặc một cái gì đó tương tự?
Giải pháp của tôi: Giải pháp
(không chính thức) của tôi đang thêm vào vòng lặp chính grep
dòng:
WAIT_TIME=180
while:
do
sleep $WAIT_TIME
[ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue
## My actions here
done
Là "$ WM_CMD" lệnh quản lý cửa sổ đích . Tôi giả sử rằng, nếu lệnh windows manager đang chạy trong hệ thống, điều đó có nghĩa là máy tính để bàn đã được tải hoàn toàn và bất kỳ lệnh "đồ họa" nào cũng chắc chắn.
Biến WM_CMD được định nghĩa ở đâu? Trong crontab
dòng:
@reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null
Nhưng tôi cũng nghĩ rằng có thể phát hiện "lệnh quản lý windows" bằng các yêu cầu hệ thống khác. Tuy nhiên, đối với tôi xác định WM_CMD trong tệp crontab là đủ.
lightdm