2017-03-18 11 views
0

Ich habe ein Python-Skript, das USB-Anschlüsse überwacht (überprüft, welche Geräte angeschlossen sind). Das Skript führt ein Scraping durch und zeigt eine Desktopbenachrichtigung an. Ich möchte, dass es bei jedem Start automatisch ausgeführt wird. Dies ist der Code:Wie wird das Skript beim Booten automatisch ausgeführt?

#! /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) 

Allerdings wird das Skript als root und versucht zu haben, die uid und guid zu ändern, ich habe es nicht geschafft, erhalten in (normal) Benutzer von Desktop-Benachrichtigungen zu den angemeldeten anzuzeigen. Jede Hilfe wäre willkommen.

PS: OS - OpenSUSE 42.1 KDE-Version - KDE Plasma 5.5.5

+0

Diese Frage wäre besser auf der [Linux-Site] (http://unix.stackexchange.com/) beantwortet. –

+0

Ich habe die Frage bearbeitet – giantas

Antwort

0

Ich gehe davon aus Sie das Skript müssen in KDE laufen, in dem Fall, dass Sie einfach zu kopieren oder verknüpfen dem Skript in das Verzeichnis ~/.kde/Autostart/ in KDE 4. In KDE 5 wurde das Verzeichnis nach ~/.config/autostart verschoben.

+0

Dieser Ordner existiert nicht – giantas

+0

Nach [KDE-Dokumentation] (https://docs.kde.org/trunk5/en/kde-workspace/kcontrol/autostart/index.html) hat das Verzeichnis wurde in KDE5 nach '~/.config/autostart' verschoben. –

0

Ich denke, Sie können Cron Job mit @reboot Modifikator verwenden. Es wird jedes Mal ausgeführt, wenn Ihr System hochfährt.

+0

Der Cron-Job führt es als Root aus – giantas

Verwandte Themen