我有一个监控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
答案 0 :(得分:0)
我假设您需要在KDE中运行脚本,在这种情况下,您只需将脚本复制或链接到KDE 4中的~/.kde/Autostart/
目录。在KDE 5中,目录已移至~/.config/autostart
答案 1 :(得分:0)
我猜您可以将{cron job与@reboot
修饰符一起使用。它将在每次系统启动时运行。