Làm cách nào để phát hiện từ tập lệnh khi máy tính để bàn của người dùng được tải?


11

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@reboottù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 xprintidlewmctrlkhô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 grepdò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 crontabdò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à đủ.


Bạn đang sử dụng trình quản lý đăng nhập nào?
mtahmed

Người quản lý đăng nhập của tôi làlightdm
Peregring-lk

Câu hỏi siêu người dùng này có thể giúp ích cho bạn. Tôi không chắc chắn nó sẽ trả lời hoàn toàn câu hỏi của bạn.
Rany Albeg Wein

1
Nó không đặc biệt mạnh mẽ, nhưng bạn có thể kiểm tra quy trình Gnome / KDE ...
jasonwryan

1
Bạn nên ghi lại những gì bạn đã làm như một câu trả lời; nó có thể giúp đỡ người khác
jasonwryan

Câu trả lời:


2

Cố gắng sử dụng D-Bus để truy vấn thông tin phiên từ loginddịch vụ. Nó có org.freedesktop.login1.Managergiao diện với một số tín hiệu như SessionNewSeatNew. org.freedesktop.login1.Seatorg.freedesktop.login1.Usergiao diện. Nó có thể giúp có được trạng thái Phiên / Chỗ ngồi / Người dùng.


1

Sử dụng tập lệnh khởi động phiên đăng nhập ~/.xprofileđể tạo một số tệp cờ cho bạn. Có thể ~/.xlogin_flag, sau đó trong tập lệnh khác của bạn sử dụng inotifywatchtừ gói inotify-toolsđể xem nó được tạo, chạm hoặc xóa.


1

Kiểm tra đầu ra của wlệnh. Bạn sẽ thấy loại đăng nhập (hiển thị X) trong trường LOGIN @.


1

Tôi nghĩ cách đơn giản nhất để kiểm tra xem người dùng có được kết nối trong X11 hay không là kiểm tra các quy trình ghi $HOME/.xsession-errorstừ khi bạn đăng nhập bằng đồ họa, tất cả các thiết bị lỗi chuẩn được chuyển hướng ở đó.

wMặt khác, chỉ cần sử dụng lệnh, như đã được đề xuất bởi @Grzegorz: nếu FROMcột bắt đầu bằng :thì đó là một phiên đồ họa.


0

Kiểm tra trong thư mục thời gian chạy của lightdm. Trên Arch với systemd và lightdm, khi người dùng đăng nhập, một tệp xauthority sẽ được tạo.

$ 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

Bạn có thể kiểm tra điều này với một cái gì đó như thế này trong vòng lặp while của bạn.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.