私はLinuxを使い始めたばかりですが、これはおそらく初心者向けの質問なので、申し訳ありません。
ワークショップでLinux PCを使用していますが、ワークショップを自動化したいと思います。そのため、すべてのツールが接続されている電源タップを取り付けました。そうすれば、すべてのツールを1つにまとめることが簡単になります。
また、USBハブの電源入力も接続されています。電源がオフになると、PCは接続が切断されていることを検出します。その情報を使用して、PCが切断されたときに自動的にロックまたは一時停止できますか?
TLDR; USBデバイスが切断されたときにPCを一時停止するスクリプトを作成できますか?
以下の小さなスクリプトは、(任意の)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>
USBイベントを検出する簡単な方法は
udevadm monitor --kernel --property --subsystem-match=usb
プログラムによるアプローチ: https://raw.githubusercontent.com/gavv/snippets/master/udev/udev_monitor_usb.c
その他の関連トピック:
ルート権限を必要とせずに、USBデバイスが(アン)プラグインされるたびにコードを実行するにはどうすればよいですか?https://unix.stackexchange.com/questions/65891/how-to-execute -a-shellscript-when-i-plug-in-a-usb-device