我有一個監視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血漿
這個問題可以在[Linux站點](http://unix.stackexchange.com/)上得到更好的回答。 –
我編輯了問題 – giantas