2017-03-18 27 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

相關問題