2017-03-18 1 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) 

그러나, 스크립트가 나는 그것이 (정상) 로그인 한 사용자에게 데스크톱 알림을 표시 할 수있었습니다하지 않은 루트로 실행의 UID 및 GUID를 변경하려고 한 :이 코드입니다. 어떤 도움을 주시면 감사하겠습니다.

PS : OS - 오픈 수세 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 documentation] (https://docs.kde.org/trunk5/en/kde-workspace/kcontrol/autostart/index.html)에 따르면 디렉토리에 KDE5에서'~/.config/autostart'로 옮겨졌습니다. –

0

아마도 @reboot 수정 자와 함께 cron 작업을 사용할 수 있습니다. 시스템이 부팅 될 때마다 실행됩니다.

+0

cron 작업이 루트로 실행합니다. – giantas

관련 문제