Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

【後で調べる】Linuxでファイルの変更をトリガーにコマンドやスクリプトを実行する

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!

【AIによる回答】

Linuxでファイルが更新されたら自動実行するには、inotifyツール(inotifywait)やsystemdpathユニット、incron(cronのファイルシステム版)などの方法があり、Rocky Linux(RHEL系)でも利用可能で、特定のファイルやディレクトリの変更を監視し、変更を検知したら指定のスクリプトやコマンドを実行できます。最も手軽なのはinotify-toolsinotifywaitで、スクリプトと組み合わせるのが一般的です。
1. inotify-toolsを使う方法(推奨)
inotifywaitコマンドは、ファイルの変更をリアルタイムで監視し、変更を検知すると指定したアクションを実行できます。
  1. インストール:
    bash
    sudo dnf install inotify-tools
    
  2. 監視スクリプトの作成(例: watch_and_run.sh:
    bash
    #!/bin/bash
    # 監視するファイル
    TARGET_FILE="/path/to/your/file.txt"
    # 実行するコマンド/スクリプト
    COMMAND_TO_RUN="/path/to/your/script.sh"
    
    echo "監視を開始します: $TARGET_FILE"
    
    # inotifywaitで変更を監視し、何らかのイベント(modify, create, deleteなど)が発生したらループ
    inotifywait -m "$TARGET_FILE" -e modify,create,delete,move |
    while read -r directory events filename; do
        echo "ファイル '$filename' が $events されました。コマンドを実行します..."
        # 実行するコマンドをここに記述
        $COMMAND_TO_RUN
        echo "コマンド実行完了。"
    done
  3. 実行可能にする:
    bash
    chmod +x watch_and_run.sh
    
  4. 実行:
    bash
    ./watch_and_run.sh & # バックグラウンドで実行
2. systemd Path Unitを使う方法(より堅牢)
systemdPathユニットは、inotifyの機能を利用しつつ、サービスの起動・停止管理と統合されており、よりシステム管理向きです。
  1. .pathファイル作成(例: /etc/systemd/system/my-file-watcher.path:
    ini
    [Unit]
    Description=Watch for file changes
    
    [Path]
    PathExists=/path/to/your/file.txt
    PathModified=/path/to/your/file.txt
    # PathExistsChanged=/path/to/your/directory/ # ディレクトリ全体を監視する場合
    
    [Install]
    WantedBy=multi-user.target
    
  2. .serviceファイル作成(例: /etc/systemd/system/my-file-watcher.service:
    ini
    [Unit]
    Description=Run script on file change
    
    [Service]
    Type=oneshot
    ExecStart=/path/to/your/script.sh # 実行したいコマンドやスクリプト
    
  3. 有効化・起動:
    bash
    sudo systemctl daemon-reload
    sudo systemctl enable my-file-watcher.path
    sudo systemctl start my-file-watcher.path
    
3. incronを使う方法
cronのようにスケジュールでなく、ファイル変更をトリガーに実行したい場合に便利です。
  1. インストールinotify-toolsがインストールされていれば、incronも利用できることが多いです。
  2. 設定incrontab -eで設定ファイルを開き、inotifywaitと同じようなルールを記述します(例: /path/to/your/file.txt IN_MODIFY /path/to/your/script.sh)。
これらの方法で、Rocky Linux上でファイルの更新をトリガーに自動でコマンドやスクリプトを実行できます。用途に応じて適切な方法を選びましょう。
Rocky Linuxでファイルが更新された際に特定のコマンドを実行するには、主にinotify-toolsパッケージに含まれる**inotifywaitコマンドを使用する方法や、entr**というユーティリティを使用する方法があります。 
方法1: inotifywait を使用する(推奨)
inotifywaitはLinuxカーネルのinotifyサブシステムを利用し、ファイルシステムのイベントを効率的に監視します。 
  1. inotify-toolsのインストール:
    Rocky Linuxでは、以下のコマンドでパッケージをインストールできます。
    bash
    sudo dnf install inotify-tools
    
    コードは注意してご使用ください。

  2. ファイル更新時にコマンドを実行するスクリプトの例:
    以下のシェルスクリプトは、指定したファイルが変更(modifycreatedeleteなど)されたときにyour_command_hereを実行します。
    bash
    #!/bin/bash
    FILE_TO_WATCH="/path/to/your/file.txt"
    COMMAND_TO_RUN="your_command_here" # 例: echo "ファイルが更新されました"
    
    echo "監視を開始します: $FILE_TO_WATCH"
    
    # -m: 常時監視を続ける, -e modify: modifyイベントを監視
    inotifywait -m -e modify "$FILE_TO_WATCH" |
    while read path action file; do
      echo "イベント検出: $file は $action されました"
      # ここで実行したいコマンドを記述
      $COMMAND_TO_RUN
    done
    
    コードは注意してご使用ください。

    このスクリプトを watch_file.sh として保存し、chmod +x watch_file.sh で実行権限を与えてから実行します。

方法2: entr を使用する 
entrは、ファイルリストをパイプで渡すだけで簡単に監視・実行ができるシンプルなツールです。開発環境などでの利用に適しています。 
  1. entrのインストール:
    デフォルトのリポジトリにはない場合があるため、EPELリポジトリの有効化が必要かもしれません。
    bash
    # EPELリポジトリの有効化(必要な場合)
    sudo dnf install epel-release
    # entrのインストール
    sudo dnf install entr
    
    コードは注意してご使用ください。

  2. ファイル更新時にコマンドを実行する例:
    監視したいファイルをリストアップしてentrにパイプで渡し、-sオプションで実行したいコマンド(シェルスクリプト)を指定します。
    bash
    echo /path/to/your/file.txt | entr -s 'your_command_here'
    
    コードは注意してご使用ください。

    ディレクトリ内のすべてのファイルを再帰的に監視したい場合は、findコマンドと組み合わせます。

    bash
    find /path/to/your/directory -type f | entr -s 'your_command_here'
    
    コードは注意してご使用ください。

     

これらの方法により、Rocky Linux環境でファイルの更新をトリガーにして自動的に処理を実行できます。
タイトルとURLをコピーしました