ดำเนินการคำสั่งหาก Linux ไม่ได้ทำงานเป็นเวลา 5 นาที


16

ฉันต้องการรันคำสั่งเช่น

 notify-send 'a'

หากเครื่อง Linux ของฉันไม่มีการใช้งานเป็นเวลา 5 นาที

โดยที่ไม่ได้ใช้งานฉันหมายถึงสิ่งเดียวกันกับที่โปรแกรมรักษาหน้าจอที่เปิดใช้งานจะใช้เพื่อกำหนด "ว่าง"


ตกลงคุณลองทำอะไร google พูดว่าอะไร คุณพยายามที่จะหาวิธีที่สกรีนเซฟเวอร์ตรวจพบนี้? กรุณาใช้เวลาในการค้นหาก่อนที่จะโพสต์คำถามที่นี่และอ่านผ่านวิธีการถามคำถามที่ดี
terdon

ฉันพบโปรแกรมxautolockแต่ไม่มีตัวอย่าง

คำตอบ:


20

ฉันใช้โปรแกรมที่เรียกว่าxprintidleเพื่อหาเวลาว่าง X ซึ่งฉันเดาอย่างยิ่งว่าจะใช้แหล่งข้อมูลเดียวกับสกรีนเซฟเวอร์ xprintidleดูเหมือนจะไม่ได้มีอัพสตรีมอีกต่อไป แต่แพคเกจ Debianยังมีชีวิตอยู่และดี

มันเป็นแอพพลิเคชั่นที่ง่ายมาก: มันคืนค่าจำนวนมิลลิวินาทีนับตั้งแต่การโต้ตอบ X ครั้งล่าสุด:

$ sleep 1 && xprintidle
940
$ sleep 5 && xprintidle
4916
$ sleep 10 && xprintidle
9932

(หมายเหตุ: เนื่องจากระบบที่อยู่ภายใต้ระบบจะให้ค่าเป็น ms ต่ำกว่าเวลาที่ไม่ได้ใช้งาน "จริง" เล็กน้อย)

คุณสามารถใช้สิ่งนี้เพื่อสร้างสคริปต์ที่ทำงานตามลำดับหลังจากเวลาที่ไม่ได้ใช้งานนานห้านาทีเช่น:

#!/bin/sh

# Wanted trigger timeout in milliseconds.
IDLE_TIME=$((5*60*1000))

# Sequence to execute when timeout triggers.
trigger_cmd() {
    echo "Triggered action $(date)"
}

sleep_time=$IDLE_TIME
triggered=false

# ceil() instead of floor()
while sleep $(((sleep_time+999)/1000)); do
    idle=$(xprintidle)
    if [ $idle -ge $IDLE_TIME ]; then
        if ! $triggered; then
            trigger_cmd
            triggered=true
            sleep_time=$IDLE_TIME
        fi
    else
        triggered=false
        # Give 100 ms buffer to avoid frantic loops shortly before triggers.
        sleep_time=$((IDLE_TIME-idle+100))
    fi
done

อ็อฟเซ็ต 100 ms เป็นเพราะการเล่นโวหารที่ระบุไว้ก่อนหน้านี้ซึ่งxprintidleจะส่งคืนเวลาที่ต่ำกว่าเวลาว่าง "จริง" เล็กน้อยเมื่อดำเนินการเช่นนี้ มันจะทำงานโดยไม่มีการชดเชยนี้และจากนั้นจะแม่นยำมากขึ้นถึงหนึ่งในสิบของวินาที แต่มันจะทริกเกอร์การxprintidleตรวจสอบเมามันในช่วงมิลลิวินาทีที่ผ่านมาก่อนที่จะสิ้นสุดช่วงเวลา ไม่ใช่หมูประสิทธิภาพ แต่อย่างใดฉันจะพบว่าไม่เหมาะสม

ฉันใช้วิธีที่คล้ายกันในสคริปต์ Perl (ปลั๊กอิน irssi) มาระยะหนึ่งแล้ว แต่ข้างต้นเขียนขึ้นและไม่ได้รับการทดสอบจริง ๆ ยกเว้นการทดลองใช้งานเล็กน้อยระหว่างการเขียน

ลองใช้โดยรันในเทอร์มินัลภายใน X ฉันแนะนำให้ตั้งค่าไทม์เอาต์เป็น 5,000 มิลลิวินาทีสำหรับการทดสอบและเพิ่มset -xด้านล่างโดยตรง#!/bin/shเพื่อรับเอาต์พุตข้อมูลเพื่อดูวิธีการทำงาน


5

ฉันใช้xssstateเพื่อวัตถุประสงค์ดังกล่าว มันมีอยู่ในsuckless-toolsแพคเกจในDebianหรืออูบุนตูหรือต้นน้ำ

จากนั้นคุณสามารถใช้เชลล์สคริปต์ต่อไปนี้:

#!/bin/sh

if [ $# -lt 2 ];
then
    printf "usage: %s minutes command\n" "$(basename $0)" 2>&1
    exit 1
fi

timeout=$(($1*60*1000))
shift
cmd="$@"
triggered=false

while true
do
    tosleep=$(((timeout - $(xssstate -i)) / 1000))
    if [ $tosleep -le 0 ];
    then
        $triggered || $cmd
        triggered=true
    else
        triggered=false
        sleep $tosleep
    fi
done

1

นี่คือแอปพลิเคชั่น C ที่ฉันพบซึ่งคุณสามารถรวบรวมได้

$ more xidle.c 
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/scrnsaver.h>

/* Report amount of X server idle time. */
/* Build with- */
/* cc xidle.c -o xidle -lX11 -lXext -lXss */


int main(int argc, char *argv[])
{
    Display *display;
    int event_base, error_base;
    XScreenSaverInfo info;
    float seconds;

    display = XOpenDisplay("");

    if (XScreenSaverQueryExtension(display, &event_base, &error_base)) {
    XScreenSaverQueryInfo(display, DefaultRootWindow(display), &info);

    seconds = (float)info.idle/1000.0f;
    printf("%f\n",seconds);
    return(0);
    }
    else {
    fprintf(stderr,"Error: XScreenSaver Extension not present\n");
    return(1);
    }
}

มันต้องการห้องสมุดคู่เพื่อสร้าง ในระบบ Fedora 19 ของฉันฉันต้องการไลบรารี่ต่อไปนี้:

$ rpm -qf /lib64/libX11.so.6 /lib64/libXext.so.6 /lib64/libXss.so.1
libX11-1.6.0-1.fc19.x86_64
libXext-1.3.2-1.fc19.x86_64
libXScrnSaver-1.2.2-5.fc19.x86_64

เมื่อติดตั้งแล้วฉันก็รวบรวมข้างต้นเช่นนั้น:

$ gcc xidle.c -o xidle -lX11 -lXext -lXss

คุณจะเห็นว่าสามารถรายงานจำนวนวินาทีที่ X ตรวจจับว่าเป็นเวลาว่างโดยเรียกใช้ดังนี้:

$ while [ 1 ]; do ./xidle ; sleep 2;done
0.005000
1.948000
3.954000
5.959000
7.965000
0.073000   <--- moved the mouse here which resets it
0.035000

xidleการใช้ปฏิบัติการนี้คุณสามารถใส่กันสคริปต์ที่สามารถทำบางสิ่งบางอย่างเช่นนี้การตรวจสอบเวลาว่างรายงานโดย

$ while [ 1 ]; do idle=$(./xidle); 
    [ $( echo "$idle > 5" | bc ) -eq 0 ] && echo "still < 5" || echo "now > 5"; 
    sleep 2;
done
still < 5
still < 5
still < 5
now > 5
now > 5
still < 5
still < 5
still < 5

ด้านบนแสดงstill < 5จนกระทั่งเวลาว่าง 5 วินาทีผ่านไปซึ่งจะเริ่มพูดnow > 5ซึ่งหมายความว่าผ่านไป 5 วินาที

หมายเหตุ:คุณสามารถรวมnotify-send 'a'ตัวอย่างข้างต้น

อ้างอิง


-1

พอร์ต bsd (ชุดรวมแพ็คเกจ) มีโปรแกรมที่สามารถทำได้:
http://man.openbsd.org/OpenBSD-current/man1/xidle.1
มันมีให้เช่นที่นี่:
http://distcache.freebsd.org/local- distfiles / นวนิยาย / xidle-26052015.tar.bz2

สร้างเช่น:

 # apt-get install libxss-dev # for include/X11/extensions/scrnsaver.h
 # gcc -o /usr/local/bin/xidle xidle.c -lX11 -lXss

โปรดทราบว่า - โปรแกรมจำเป็นต้องมีเส้นทางแบบเต็มไปยังไบนารีเพราะมันถูกส่งผ่านไปยัง execv ()

$ xidle -timeout 120 -program "/usr/bin/xlock -mode pyro"  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.