Как запустить скрипт Python при вставке флешки

Моя цель - запустить скрипт Python при вставке USB-накопителя. Я написал правило udev и сценарий оболочки, который вызывается в этом правиле.

правило udev: /etc/udev/rules.d/10-usb.rules

KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", RUN+="/home/Hypotheron/Desktop/script.sh" 

скрипт.ш:

#!/bin/sh

echo 'Hello, world.' > /home/Hypotheron/Desktop/foo.txt
#/home/Hypotheron/Desktop/job.py & exit

Первая строка моего файла Python:

#!/usr/bin/python 

Я также сделал следующие команды:

chmod +x job.py
chmod +x script.sh

В script.sh при раскомментировании строки записи в foo.txt файл foo.txt создается при каждой вставке флешки.

Когда я комментирую эту строку и раскомментирую строку, запускающую файл Python, она не работает.

Запуск script.sh через терминал работает в обоих случаях, но при вставке флешки работает только случай foo.txt.

Любая помощь будет оценена по достоинству.


person Hypotheron    schedule 04.07.2017    source источник


Ответы (1)


   RUN{type}
       Add a program to the list of programs to be executed after
       processing all the rules for a specific event, depending on "type":

       "program"
           Execute an external program specified as the assigned value. If
           no absolute path is given, the program is expected to live in
           /lib/udev; otherwise, the absolute path must be specified.

           This is the default if no type is specified.

       "builtin"
           As program, but use one of the built-in programs rather than an
           external one.

       The program name and following arguments are separated by spaces.
       Single quotes can be used to specify arguments with spaces.

       This can only be used for very short-running foreground tasks.
       Running an event process for a long period of time may block all
       further events for this or a dependent device.

       Starting daemons or other long-running processes is not appropriate
       for udev; the forked processes, detached or not, will be
       unconditionally killed after the event handling has finished.

На справочной странице udev обратите особое внимание на последние 2 абзаца.
Я предполагаю, что вы обнаружили часть безусловного уничтожения.

Редактировать 1 год спустя:
Я пересмотрел это после того, как кто-то проголосовал за него, и я решил проблемы, а именно то, что root (который запускает этот процесс) не имеет записи X-терминала, необходимой для определенных вещей, таких как notify-send или запуск программа с графическим интерфейсом, и все еще остается уничтожение процесса после события, как упоминалось ранее.
Следующее отправляет уведомление на терминал и запускает программу wxPython с графическим интерфейсом при подключении USB-устройства.

Сценарий:

#!/bin/sh
DISPLAY=:0
export DISPLAY
/usr/bin/notify-send "Usb Device detected" "Starting Reminder program" | at now
/usr/bin/python3 /home/rolf/reminders/reminders2.1.0/reminder.py | at now

определяя DISPLAY, мы обходим проблему root с отсутствием записи термина X
, передавая команды, которые мы хотим запустить, программе at с инструкцией запустить ее сейчас, мы избегаем уничтожения процесса udev.

Файл /lib/udev/rules.d/10-usbinsert.rules:

KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", RUN+="/usr/bin/sudo -u rolf /home/rolf/script.sh &"

Я надеюсь, что это поможет или заставит вас двигаться в правильном направлении.

person Rolf of Saxony    schedule 04.07.2017