2017-05-10 11 views
1

この質問や少なくとも同様の質問をする前に、私はかなりの自信を持っています。私の問題は少し問題ですが、それは簡単です。起動時にPythonスクリプトを実行して、Linuxでマウスとキーボードの動作を記録する

起動時にcronでPythonスクリプトを実行しようとしましたが、Linuxでetc/rc.localファイルを編集しましたが、両方の方法でPythonスクリプトを実行できませんでした。

スクリプトは、キーボードとマウスの両方のリスナーオブジェクトを使用して、キーボードとマウスの動作を記録します。私はXlibに依存するpynputと呼ばれるサードパーティのパッケージを使用しています。私のスクリプトはsudoが必要なファイルを編集するので、スクリプトをsudoで実行する必要があります。あなたが知っているので、スクリプトを見て持っている必要があり

:このスクリプトは、キーボードとマウスの活動を記録します

#!/usr/bin/env python 
#backlight.py 

from pynput.keyboard import Listener as KeyboardListener 
from pynput.mouse import Listener as MouseListener 

import time 

STATUS = ""    # Keyboard backlight ON/OFF status 
turnOffSecs = 6   # Turn off keyboard backlight for x seconds of inactivity 

# Keyboard brightness control file (change to your directory) 
file_pth = "/sys/devices/platform/asus-nb-wmi/leds/asus::kbd_backlight/brightness" 

def get_LEVEL(): 
    """return the current level of brightness of keyboard backlight""" 
    with open(file_pth, "r") as f: 
     brightness_level = f.read()[0] 
    return brightness_level 


class Sec_timer: 
    """ 
    Sec_timer(until=None) 
     Create a timer that counts x number of seconds starting from 0 

     until arg can be used for reseting the timer: 

    *Example: 

     timer = Sec_imer(20) 
     while timer.elapsed < timer.until:     
      timer.count()    # count a second 
     else: 
      timer.reset_timer()   # reset timer on exit 
    """ 
    def __init__(self, until=None): 
     self.until = until 
     self.elapsed = 0 

    def count_sec(self): 
     "Count one second per-call" 
     time.sleep(1) 
     self.elapsed += 1 

    def reset_timer(self): 
     self.elapsed = 0 



timer = Sec_timer(turnOffSecs)   # Sec_timer(x) turn off keyboard backlight for x seconds of inactivity 

# General event handler to reset timer 
def reset_timer(*args): 
    global STATUS 

    timer.reset_timer() 
    if STATUS == "OFF": 
     # print(STATUS) 
     with open(file_pth, "w") as f: 
      f.write(current_brightnessLevel) 
      f.close() 
      STATUS="ON" 



keyboard_listener = KeyboardListener(on_press=reset_timer, 
          on_release=(lambda *args: None)) 

mouse_listener = MouseListener(on_click=reset_timer, 
          on_scroll=reset_timer, 
          on_move=reset_timer) 


keyboard_listener.start() 
mouse_listener.start() 


while True: 
    timer.count_sec() 
    if timer.elapsed > timer.until: 
     # print "current brightness:" + get_LEVEL() 
     if get_LEVEL() != "0": 
      with open(file_pth, "w") as f: 
       current_brightnessLevel = get_LEVEL() 
       f.write("0") 
       STATUS = "OFF" 

は、任意のキーボードまたはマウスの活動は、タイマーをリセットします。 x秒が経過し、キーボードやマウス操作が行われていない場合は、輝度フォルダに "0"を書き込んでキーボードのバックライトを消してください。マウスまたはキーボードイベントが発生した場合afterスクリプトをオフにすると、バックライトはバックライトの以前の輝度レベルに従ってキーボードの明るさをオンにします。

ターミナルを使用してスクリプトを実行すると、正常に動作します。しかし、このスクリプトの起動を自動化するのは難しい作業です。ここで私がこれまで試したものです:

*注、私が作ったスクリプトファイルを実行可能とbacklight.pyは/home/userに常駐:

の端末で

1):

$ xhost + 
$ sudo ./backlight.py 

作品罰金は!など `使用

2)/ rc.localに私が追加:

xhost + 
cd /home/user/ 
./backlight.py 

スクリプトの再起動後に実行されなかった

使用

3)etc/rc.local

$ sudo crontab -e

@reboot xhost + 
@reboot /home/user/backlight.py 

再起動後に実行しなかった

Xlibの問題のため、xhost +を実行しなければなりませんでした。最後の2つの方法を使用しても機能しませんでした。私はこれがプログラミング上の問題だと推測しています。おそらくそれはXlibと何か関係がありますか?

私はこのスクリプトがキーボードLEDとのインタフェースに関しては非常識であると知っています。あなたが望むなら、それは「悪いスクリプト」と呼んでいます。私はLinuxドライバの詳細を掘り下げようとしているのではないので、ファイル入出力ソリューションを使ってドライバの問題を解決しようとしていますが、少なくとも今はありません!

+0

私はいくつかの努力の結果、スクリプトに 'pynput'やその依存関係' Xlib'のバグがあることを知りました。 – direprobs

答えて

0

rootが必要で起動時に実行する必要がある場合は、カスタムサービスを作成してみてはどうでしょうか?

カスタムサービスを作成すると、systemdがそれを起動できます。 sudo systemctl start yourservice でサービスを開始することができます。起動時に(ルートとして)sudo systemctl enable yourserviceで実行されていることを確認できます。ユーザーに関係なく開始されます。

私は個人的にこれを前にしていませんが、それほど難しいことはありません。基本的には、/ etc/systemd/systemディレクトリに作成された説明と実行コマンドを含むファイルです。すばやいグーグルが私にこのガイドを与えました:https://blog.sdbarker.com/post/adding-custom-units-services-to-systemd-on-arch-linux/

希望に役立ちます。

+0

これは機能しませんでした。 – direprobs

+0

詳細を教えてください。 – Brainiac

+0

この問題の原因は私のコードです。多分これは 'pynput'のためです。私はこのコードを完全に削除し、昨日まで見つからなかった[スクリプト](https://askubuntu.com/questions/762895/auto-dimming-laptop-keyboard-backlit-when-idle)を使用しました。しかし、どうしてターミナルでしか動作しないのだろうか?奇妙な!これは 'pynput'や' Xlib'バグです。 – direprobs

関連する問題