如何在启动时自动运行脚本?

时间:2017-03-18 20:48:40

标签: python python-2.7 opensuse

我有一个监控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 Plasma 5.5.5

2 个答案:

答案 0 :(得分:0)

我假设您需要在KDE中运行脚本,在这种情况下,您只需将脚本复制或链接到KDE 4中的~/.kde/Autostart/目录。在KDE 5中,目录已移至~/.config/autostart

答案 1 :(得分:0)

我猜您可以将{cron job与@reboot修饰符一起使用。它将在每次系统启动时运行。