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