web-dev-qa-db-ja.com

開いているすべてのシェルでコマンドを実行します

私はsshfsを使用して、開発ボックスで便利なことを行っています。大好きです。しかし、私は通常、ふたを閉じる前にfusermount -uを忘れます(休止状態をトリガーします)。その後、戻ってきたときにsshfsがフリーズし、クリーンアップする必要があります。

/etc/pm/sleep.dに、すべてのsshfsマウントポイントとDWIMを反復処理するスクリプトが必要です。 fusermount -uチェックで書かれたdf -lコードがあります。しかし、テストでは、fusermount -uが機能するために、すべてのマウントポイントからCDを取り出す必要があると判断しました。

しかし、開いているbashターミナルを繰り返し処理して、そこで役立つことを行う方法がわかりません。助けて?

3
Rob Kinyon

これは、カスタムユーザーシグナルハンドラーを~/.bashrcに登録することで実行できます。

trap '[ "$PWD" = "/my/sshfs/mount" ] && cd ~' SIGUSR1

次に、このハンドラーは、SIGUSR1シグナルをbashプロセスに送信するたびに呼び出されます。

killall -u "$USER" -USR1 bash

これにはいくつかの注意点があります。

  • シグナルハンドラー必須すべての(インタラクティブおよび非インタラクティブ)bashインスタンスに登録されている必要があります。登録されていない場合、デフォルトのアクション(終了)が実行されます。 ~/.bashrcを使用すると一般的にこれが行われると思います。ただし、このスタートアップファイルのソースを上書きするbashのオプションがあります。
  • シェルプロセスはいずれも、指定されたsshfsディレクトリにあることに依存する何かの途中にある可能性があります。このディレクトリからランダムに変更すると、特定のスクリプトがその時点(またはそれ以降)に実行していることによっては、任意の未定義の動作が発生する可能性があります。
  • Bashプロセスから開始された他のプロセスが、指定されたディレクトリに残っている可能性があります。これらのプロセスのためにできることはたくさんありませんが、他のプロセスはそれらを殺します。
2
Digital Trauma