私のBashスクリプトの改善

私のBashスクリプトの改善

Bashスクリプトが問題なく完全に実行されるように改善する必要があります。このスクリプトはds4drvここで使用され、修正方法がわからないいくつかの問題があります。

最初の問題は、コントローラが検出されたときに常に実行または動作しないことです。これに対してudevルールを作成しましたが、コントローラを検出するときに常にスクリプトを実行しない理由は明確ではありません。

2番目の問題ds4drvは、通常のユーザーではなくrootとしてのみ実行できることです。

3番目の質問は、PIDロックファイルを作成した後にそれを処理する正しい方法がわからないため、PIDプロセスがもう存在しない場合はPIDロックファイルを削除することです。 BashスクリプトでPIDファイルを使用する方法に関する適切な文書を見つけることは困難であるため、実行中のインスタンスは1つしかありません。

私のds4drv udevのルールは次のとおりです。50-ds4drv.rules

KERNEL=="uinput", GROUP="users", MODE="0666"
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="05c4", GROUP="users", MODE="0
666"
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", KERNELS=="0005:054C:05C4.*", GROUP="users" MODE="0666"
ACTION=="add", SUBSYSTEM="usb", ATTRS{idProduct}=="054c", RUN+="/home/user/scripts/ds4check.sh", GROUP="users"
, MODE="0666"

私はudevルールがこのようなものでなければならないと確信しており、GROUPユーザーに対して読み書きするため、権限が正しいようです。いくつかの問題があるようです。私のbashスクリプトが実行され、コントローラデバイスが接続されたときにこのルールが自動的に実行されるように設定されると、一部のゲームは接続されたコントローラデバイスがないかのように応答しなくなります(取られたアクションがあると仮定)/dev/js0。代わりに対処してください/dev/js1。特にrootとして実行されていない場合、このエラーが返されることがよくあります。

OSError: [Errno 13] Permission denied: '/dev/input/event17'

もちろん、bashスクリプトもあります。ds4check.sh

#!/bin/bash
# DS4 Check Script

pidfile=/tmp/ds4drv.pid

# check if process is already running
for pid in $(pidof -x /home/user/scripts/ds4check.sh $pidfile); do
    if [ $pid != $$ ]; then
      echo "[$(date)] : ds4check.sh : Proccess is already running with PID $pid" >> /home/user/.cache/ds4drv.log
      exit 1
# if not running then run and apply config
      else  ( ds4drv --hidraw --config /home/user/.config/ds4drv.conf )

      exit 0
    fi
done

# remove PID file on exit... hopefully
trap "srm -rv -- '$pidfile'" EXIT >> /home/user/.cache/ds4drv.log

ベストアンサー1

2点心配ですね

  • PIDファイルに慣れていませんが、回避pgrep策として使用することをお勧めします。
  • ds4drvデーモンのようですが、udev短期実行プロセスのみをサポートします。

    実行{タイプ}

    ...

    これは、非常に短期的に実行されるフォアグラウンドジョブでのみ使用できます。長期実行イベントプロセスは、そのデバイスまたはスレーブデバイスに対するすべての追加イベントをブロックできます。

    デーモンや他の長期実行プロセスを開始することはudevには適していません。切り離されたかどうかにかかわらず、分岐されたプロセスはイベント処理が完了した後に無条件に終了します。

次のスクリプトをコピーしてください。

#!/bin/bash
# DS4 Check Script

pgrep ds4drv || ds4drv --hidraw --config /home/user/.config/ds4drv.conf & disown

おすすめ記事