2017-03-18 21 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: 操作系统 - 的OpenSUSE 42.1 KDE版本 - KDE 5.5.5血浆

+0

这个问题可以在[Linux站点](http://unix.stackexchange.com/)上得到更好的回答。 –

+0

我编辑了问题 – giantas

回答

0

我想你需要的脚本在KDE在这种情况下,你可以简单地复制或脚本链接到在~/.kde/Autostart/目录下运行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作业以根用户身份运行 – giantas

相关问题