1분 동안 사용자 활동이 없으면 네트워크 카드 연결을 끊고 싶습니다. 여기서 비활성은 마우스 클릭이나 휠 스크롤이 없는 것으로 정의됩니다. 마우스 움직임이 무시되므로 xscreensaver는 적합하지 않으며 xautolock도 마찬가지입니다. 명령줄에서 마우스 이벤트를 감지하고 구별하는 방법은 무엇입니까?
답변1
Meuh의 지시에 따르면 이 "화면 보호기"가 수행되는 방법은 다음과 같습니다.
#!/bin/bash
evemu-record /dev/input/event2 |
stdbuf -oL egrep 'EV_KEY|REL_WHEEL' |
(
./network_saver.sh
)
network_saver.sh는 다음과 같습니다.
#!/bin/bash
WAIT=5
while [ 1 ]
do
echo Waiting for $WAIT seconds of mouse button inactivity
while read -t $WAIT line
do
echo -n .
done
echo; echo Disabling networking
nmcli n off
echo Waiting for a mouse button press
while read line
do
echo -n .
break;
done
echo; echo Enabling networking
nmcli n on
# Connect the main nic as soon as possible
nmcli conn up "Ethernet connection 1" >/dev/null
done
답변2
이를 수행하는 프로그램을 작성하고 싶지 않다면 마우스 이벤트를 표시할 수 있는 여러 프로그램이 있습니다. 예를 들어, evemu-record
마우스 입력 장치에서는 모든 버튼 누르기, 휠 스크롤 및 움직임이 다음과 같이 매우 자세한 출력으로 표시됩니다.
E: 0001 0111 0001 # EV_KEY / BTN_RIGHT 1
E: 0000 0000 0000 # ------------ SYN_REPORT (0) ---------- +552ms
E: 0002 0008 -001 # EV_REL / REL_WHEEL -1
E: 0000 0000 0000 # ------------ SYN_REPORT (0) ---------- +1016ms
E: 0002 0000 0001 # EV_REL / REL_X 1
E: 0002 0001 0003 # EV_REL / REL_Y 3
evemu-record
입력 장치를 나열하려면 인수 없이 실행하세요 . 내가 아는 한 그건 그렇다.
/dev/input/event5: Logitech USB Optical Mouse
그런 다음 다음과 같은 bash 쉘 스크립트를 작성할 수 있습니다.
( pid=$BASHPID
evemu-record /dev/input/event5 |
stdbuf -oL egrep 'EV_KEY|REL_WHEEL' |
( while read -t 5 junk
do echo -n .
done
echo ok
kill -pipe $pid
)
)
이는 egrep
버튼 및 스크롤 휠 라인을 제외한 모든 라인을 필터링하는 데 사용되며, 출력이 버퍼링되지 않도록 보장합니다(grep에서 stdbuf
동일한 작업을 수행하는 옵션을 허용할 수도 있음). --line-buffered
while 루프는 각 줄을 읽고 "."을 에코하지만 5초 이내에 입력( )이 없으면 -t 5
루프가 중지됩니다. 마지막으로 kill
파이프라인에는 a가 필요합니다. 그렇지 않으면 새 이벤트가 감지되어 egrep
SIGPIPE를 통해 종료될 때까지 파이프라인이 종료되지 않습니다. kill -pipe
SIGPIPE 신호를 사용 하면 shell()의 프로세스 ID를 얻기 위해 쉘이 kill -hup
필요 하지 않으므로 주변 쉘 코드가 종료되지 않습니다.(...)
$BASHPID
또는 에서 PS/2 데이터 스트림을 얻을 수 있지만 /dev/input/mice
형식에 대한 자세한 내용은 모르겠습니다. 다음 명령을 사용하면 3바이트 레코드를 볼 수 있습니다.
od -v -An -w3 -tx1 /dev/input/mice