Cách chạy script sau khi tiếp tục và sau khi mở khóa màn hình


13

Trong Ubuntu 12.04 LTS, tôi muốn chạy các tập lệnh sau khi tiếp tục tạm dừng và sau khi mở khóa máy tính để bàn của mình. Chúng cần được chạy như người dùng của tôi và có quyền truy cập vào $DISPLAY.

Đặc biệt, tôi muốn

  • khởi động lại nm-appletđể khắc phục lỗi 985028
  • hiển thị thông báo tùy chỉnh bằng cách sử dụng notify-send
  • có thể những thứ khác khi tôi làm việc

Khi tôi tiếp tục, các tập lệnh /etc/pm/sleep.d/được chạy, nhưng chúng chạy bằng root, không có kiến ​​thức về màn hình và tên người dùng của tôi. Nó có thể hoạt động nếu tôi mã hóa tên người dùng của mình và exportmặc định DISPLAY :0trong các tập lệnh này, nhưng cảm giác đó là một vụ hack rất xấu xí.

Các tập lệnh ~/.config/autostart/xyz.desktopchạy sau khi đăng nhập, nhưng chúng không chạy sau khi chỉ mở khóa màn hình sau khi tiếp tục.

Có cách nào để chạy tập lệnh sau khi mở khóa màn hình sau khi tiếp tục không?


Để không mã cứng tên người dùng, bạn có thể sử dụng users, giả sử rằng không có ai khác đăng nhập. (Hoặc không thành vấn đề)
Sparhawk

Câu trả lời:


9

Dường như bạn phải mã cứng tên người dùng trong câu trả lời trước đó, vì vậy đây là một tập lệnh đơn giản cho /etc/pm/s ngủ.d nếu có ai đang tìm cách khắc phục nhanh:

#!/bin/bash 
case "$1" in
    hibernate|suspend)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on suspend"
        ;;
    thaw|resume)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on resume"
        ;;
esac

5

Câu hỏi này tại trang web Unix & Linux ghi lại một cách tiếp cận khác bằng cách sử dụng các thông điệp dbus:

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean true" &> /dev/null; then SCREEN_LOCKED; elif echo $X | grep "boolean false" &> /dev/null; then SCREEN_UNLOCKED; fi done )

(Thay thế SCREEN_LOCKED và SCREEN_UNLOCKED bằng các hành động bạn muốn thực hiện.)

Sử dụng xrandr 1>/dev/null 2>1như hành động mở khóa đã khắc phục sự cố của tôi rằng màn hình độ phân giải / vị trí không được khôi phục chính xác khi mở khóa màn hình (xrandr dường như gây ra việc đọc lại cài đặt màn hình). Tôi đã thêm dòng này làm tác vụ nền trong .bash_profile của mình (hoàn toàn có thể tốt hơn khi tệp máy tính để bàn trong ~ / .config / autostart, vì nó chỉ chạy khi bạn khởi động gnome):

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean false" &> /dev/null; then xrandr 1>/dev/null 2>1; fi done ) &

Nền tảng khác về API gnome-Screensaver có thể được tìm thấy tại trang web này và trên màn hình dbus tại đây .


1

Một giải pháp là một kịch bản chạy khi đăng nhập vào máy tính để bàn và bắt các thông điệp dbus. Sau khi tiếp tục tạm dừng màn hình bị khóa và sau khi nhập mật khẩu, có một sự kiện Mở khóa trên dbus.

(Cảm ơn Kim SJ đã đưa tôi đi đúng hướng. Tôi không có tín hiệu ScreenSaver, nhưng tìm thấy một giao diện khác để sử dụng).

Trong ~/.config/autostart/, tôi có tệp .desktop bắt đầu tập lệnh bash:

$ cat ~/.config/autostart/mymonitor.desktop
[Desktop Entry]
Categories=System;Monitor;
Comment=Monitor dbus for unlock signals
Exec=/usr/local/bin/unlock_monitor
Name=unlock_monitor
Type=Application

Các unlock_monitorkịch bản màn hình đọc thông điệp dbus từ com.canonical.Unity.Sessionvà thực hiện các công cụ trên Unlockedtín hiệu:

#!/bin/bash

dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session" --profile \
| while read dbusmsg; do
    if [[ "$dbusmsg" =~ Unlocked$ || "$dbusmsg" =~ NameAcquired$ ]] ; then
        sleep 5
        notify-send "$(basename $0)" "Unlocked or freshly logged in..."
        # ...
    fi
done

Khi đăng nhập, không có tín hiệu "Đã mở khóa", nhưng có tín hiệu "NameAcquired" khi dbus-monitorbắt đầu.


0

Bạn có thể chạy một kịch bản bằng cách sử dụng start-stop-daemon. start-stop-daemon có thể rẽ nhánh luồng chạy dưới dạng uid và gid khác nhau, do đó giải quyết vấn đề của bạn.

Những gì bạn cần làm là viết một tập lệnh công việc được đặt trong hệ thống PATH như thế nào /usr/binvà để tạo một tập lệnh daemon bổ sung /etc/pm/sleep.d. Kết hợp pm-suspendhành động như resumehoặc thawtập lệnh daemon cam kết tập lệnh công việc thông qua

start-stop-daemon --start $ARGs --name nm-rtvt--exec /usr/bin/job_script

nơi ARGscó thể --chuid 1001:1001hoặc chỉ --user your_username.

Và để đảm bảo tính toàn vẹn, bạn cũng có thể muốn tập lệnh daemon dừng damon được đặt tên nm-rtvttrước khi tạm dừng qua

start-stop-daemon --stop <...>

pm-suspendhành động phù hợp như suspendhoặc hibernate.

Để biết chi tiết , man start-stop-daemon. Và có nhiều ví dụ khác trong /etc/init.dcác kịch bản daemon.

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.