Как я могу выполнить команду, когда USB-устройство (скидка-) подключено?

Я плохо знаком с Linux, и это - вероятно, вопрос о новичке, таким образом, жаль об этом.

Я использую ПК Linux в своем цехе, и я хотел бы автоматизировать семинар. Вот почему я установил удлинитель, где все мои инструменты включаются к. Тем путем это легко к повороту всех моих инструментов все в.

Мне также включили вход питания концентратора usb там. Когда это превращено, ПК обнаруживает его, как разъединено. Я могу использовать ту информацию, чтобы автоматически заблокировать или приостановить ПК, когда это разъединяется?

TLDR; я могу сделать сценарий, который приостанавливает ПК, когда USB-устройство разъединяется?

3
задан 23 September 2019 в 09:29

2 ответа

2
ответ дан 17 November 2019 в 09:37

Действие на (скидке), соединяющей USB-устройство

крошечный сценарий ниже, приостановит компьютер на событии разъединения (любого) объема usb.

#!/usr/bin/env python3
import gi
from gi.repository import GLib, Gio
import subprocess

class WatchOut:

    def __init__(self):
        someloop = GLib.MainLoop()
        self.setup_watching()
        someloop.run()

    def setup_watching(self):
        self.watchdrives = Gio.VolumeMonitor.get()
        # event to watch (see further below, "Other options")
        self.watchdrives.connect("volume_removed", self.actonchange)

    def actonchange(self, *args):
        # command to run (see further below, "Other options")
        subprocess.Popen(["systemctl", "suspend"])

WatchOut()

, Чтобы использовать:

  • Копия сценарий в пустой файл, сохраните его как watchout.py
  • Пробег он на заднем плане:

    python3 /path/to/watchout.py
    
  • , Если все работы как ожидалось, управляйте им от нового проекта

Другие варианты

В этом сценарии, очевидно, сигнал на "volume_removed" используется. Другие возможные события:

"volume_added", "volume_removed", "mount_added", "mount_removed"

, Чтобы заставить его выполнить другие команды на событии, замените команду в строке:

subprocess.Popen(["systemctl", "suspend"])

(команда и args установлены как список, как ["systemctl", "suspend"])

РЕДАКТИРУЮТ - Только действуют на конкретно названные объемы

, Как упомянуто в комментарии, Вы предпочли бы только управлять командой на конкретно названных объемах. Если Вы будете управлять примером ниже с одним или несколькими volumenames как аргументы, то действие будет ограничено только теми объемами:

#!/usr/bin/env python3
import gi
from gi.repository import GLib, Gio
import subprocess
import sys

args = sys.argv[1:]

class WatchOut:

    def __init__(self):
        someloop = GLib.MainLoop()
        self.setup_watching()
        someloop.run()

    def setup_watching(self):
        self.watchdrives = Gio.VolumeMonitor.get()
        # event to watch (see further below, "Other options")
        self.watchdrives.connect("volume_removed", self.actonchange)

    def actonchange(self, event, volume):
        if volume.get_name() in args:
            # command to run (see further below, "Other options")
            subprocess.Popen(["systemctl", "suspend"])

WatchOut()

Использование

Является в значительной степени тем же как первым, просто добавьте volumenames как аргументы, например,

python3 /path/to/watchout.py <volumename_1> <volumename_2>
4
ответ дан 17 November 2019 в 09:37

Другие вопросы по тегам:

Похожие вопросы: