2017-03-18 33 views
0

私は、USBポートを監視するpythonスクリプトを持っています(どのデバイスが接続されているかを確認します)。スクリプトは何らかのスクラップを実行し、デスクトップ通知を表示します。すべての起動時に自動的に実行したいと思います。これはコードです:起動時に自動的にスクリプトを実行するには?

#! /usr/bin/python 

import glib 
import re 
import subprocess 
import requests 
import bs4 
import datetime 
import sys 
import os 
import time 
from selenium import webdriver 
from pyudev import Context, Monitor 
from selenium.common.exceptions import NoSuchElementException 

def demote(): 
    def result(): 
     os.setgid(100) 
     os.setuid(1000) 
    return result 

def inotify(title, message): 
    subprocess.call(['notify-send', '{}\n'.format(title), '{0}\n'.format(message)], preexec_fn=demote()) 
    #os.system('notify-send ' + title + ' ' + message) 

def get_network_data(tout): 
    """Scrapes balance data from ISP website.""" 

    if tout is not None: 
     try: 
     # Do some scraping 
      if data_found: 
       full_msg = '{0}\n{1}'.format(my_balance.capitalize(), airtime_balance.capitalize()) 
       inotify('My Balance', full_msg) 
       #subprocess.call(['notify-send', 'My Balance', '\n{0}\n{1}'.format(my_balance.capitalize(), airtime_balance.capitalize())], preexec_fn=demote()) 

      else: 
       print('Could not retrieve data from page...') 
       full_msg = '{0}'.format('Error: Could not retrieve data from page.') 
       inotify('My Balance', full_msg) 
       #subprocess.call(['notify-send', 'My Balance', '\n{0}'.format('Error: Could not retrieve data from page.')], preexec_fn=demote()) 

     except NoSuchElementException: 
      print('Could not locate element...') 
      full_msg = '{0}'.format('Error: Could not locate element - acc.') 
      inotify('My Balance', full_msg) 
      #subprocess.call(['notify-send', 'iMonitor:get_network_data', '\n{0}'.format('Error: Could not locate element - acc.')], preexec_fn=demote()) 

    else: 
     print('Could not find USB device...') 
     full_msg = '\n{0}'.format('Error: Could not find USB device.') 
     inotify('My Balance', full_msg) 
     #subprocess.call(['notify-send', 'iMonitor', '\n{0}'.format('Error: Could not find USB device.')], preexec_fn=demote()) 

def identify_phone(observer, device): 
    """Identifies if specific USB device (phone) is connected (tethered).""" 

    global last_updated, initial_search, msg_count 

    current_time = datetime.datetime.now() 
    time_diff = current_time - last_updated 

    if (time_diff.seconds > 300) or initial_search: 
     try: 
      time.sleep(0.25) 
      tout = subprocess.check_output("lsusb | grep 1234:5678", shell=True) 
     except subprocess.CalledProcessError: 
      tout = None 

     last_updated = datetime.datetime.now() 
     initial_search = False 

     get_network_data(tout) 

    if time_diff.seconds > 10: 
     msg_count = 1 

    if not initial_search and msg_count == 1: 
     wait_time = datetime.datetime.fromtimestamp(600 - time_diff.seconds) 
     message = wait_time.strftime('You may have to wait %-M minute(s), %-S second(s) before another check is done.') 
     print('Could not retrieve data from page...') 
     full_msg = '\n{0}'.format(message) 
     inotify('My Balance', full_msg) 
     #subprocess.call(['notify-send', 'iMonitor:Identify Phone', '\n{0}'.format(message)], preexec_fn=demote()) 
     msg_count += 1 

try: 
    initial_search = True 
    last_updated = datetime.datetime.now() 
    msg_count = 1 
    try: 
     from pyudev.glib import MonitorObserver 

    except ImportError: 
     from pyudev.glib import GUDevMonitorObserver as MonitorObserver 

    context = Context() 
    monitor = Monitor.from_netlink(context) 

    monitor.filter_by(subsystem='usb') 
    observer = MonitorObserver(monitor) 

    observer.connect('device-added', identify_phone) 
    monitor.start() 

    glib.MainLoop().run() 

except KeyboardInterrupt: 
    print('\nShutdown requested.\nExiting gracefully...') 
    sys.exit(0) 

しかし、スクリプトはrootとして実行され、uidとGUIDを変更しようとした、私はそれが(正常)にログインしたユーザーにデスクトップ通知を表示するために取得するために管理していません。どんな助けもありがとう。

PS: OS - openSUSEの42.1 KDE版 - KDEプラズマ5.5.5

+0

この質問は、[Linuxのサイト](http://unix.stackexchange.com/)にある方が良いでしょう。 –

+0

私は質問を編集しました – giantas

答えて

0

私はあなたが単純にコピーまたは~/.kde/Autostart/ディレクトリ内にスクリプトをリンクすることができ、その場合にはKDEで実行するスクリプトが必要と仮定KDE 4. KDE 5では、ディレクトリは~/.config/autostartに移動されました。

+0

そのフォルダは存在しません – giantas

+0

[KDEのドキュメント](https://docs.kde.org/trunk5/en/kde-workspace/kcontrol/autostart/index.html)によると、ディレクトリにはKDE5の '〜/ .config/autostart'に移動されました。 –

0

おそらく、あなたは@reboot修飾子でcronジョブを使うことができます。システムが起動するたびに実行されます。

+0

cronジョブはrootとして実行します – giantas

関連する問題