web-dev-qa-db-ja.com

USBデバイスが(接続されていない)接続されているときにコマンドを実行するにはどうすればよいですか?

私はLinuxを使い始めたばかりですが、これはおそらく初心者向けの質問なので、申し訳ありません。

ワークショップでLinux PCを使用していますが、ワークショップを自動化したいと思います。そのため、すべてのツールが接続されている電源タップを取り付けました。そうすれば、すべてのツールを1つにまとめることが簡単になります。

また、USBハブの電源入力も接続されています。電源がオフになると、PCは接続が切断されていることを検出します。その情報を使用して、PCが切断されたときに自動的にロックまたは一時停止できますか?

TLDR; USBデバイスが切断されたときにPCを一時停止するスクリプトを作成できますか?

3
LenDuck24

USBデバイスの接続に対する(dis)アクション

以下の小さなスクリプトは、(任意の)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"])

(コマンドと引数は["systemctl", "suspend"]のようにリストとして設定されます)

編集-特定の名前のボリュームにのみ作用する

コメントで述べたように、特定の名前のボリュームに対してのみコマンドを実行することをお勧めします。引数として1つ以上のボリューム名を指定して以下の例を実行すると、アクションはそれらのボリュームのみに制限されます。

#!/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()

使用法

最初のものとほとんど同じですが、ボリューム名を引数として追加するだけです。

python3 /path/to/watchout.py <volumename_1> <volumename_2>
5
Jacob Vlijm
2
kenn