26

一部のファイルが変更されたときにプロセスを再起動する簡単な解決策はありますか (ほとんどのディストリビューションで提供されるユーティリティを介して、一般的なシェル ユーティリティを使用するか、いくつかの単純な python/... スクリプトを使用します)。

のように単に sth を呼び出すとよいでしょうwatch -cmd "./the_process -arg" deps/*

更新: 提案された inotify-tools と組み合わせた単純なシェル スクリプト (素晴らしい!) は、私のニーズに適合します (引数なしのコマンドで動作します):

#!/bin/sh
while true; do
  $@ &
  PID=$!
  inotifywait $1
  kill $PID
done
4

7 に答える 7

19

はい、inotifyシステムを使用してinotifywait、またはinotify-toolsinotifywatchからディレクトリを監視できます。

inotifywaitイベントを検出すると終了します。-rディレクトリを再帰的に監視するオプションを渡します。例: inotifywait -r mydirectory.

すべてのイベントを監視する代わりに、監視するイベントを指定することもできます。ファイルまたはディレクトリの内容の変更のみを待機するには、オプションを使用します-e modify

于 2012-09-04T13:14:15.760 に答える
0

この「ワンライナー」を使用して、ファイルの変更に基づいて長時間実行されるプロセスを再起動します

trap 'kill %1' 1 2 3 6; while : ; do YOUR_EXE & inotifywait -r YOUR_WATCHED_DIRECTORY -e create,delete,modify || break; kill %1; sleep 3; done

これにより、プロセスが開始され、その出力が同じコンソールに保持され、変更があった場合はプロセスがシャットダウンされ、3 秒間待機して (同じ秒内の書き込みまたはプロセスのシャットダウン時間)、実行されます。上記をもう一度。
ctrl-c & ssh-disconnect が尊重され、完了するとプロセスが終了します。

読みやすくするために:

trap 'kill %1' 1 2 3 6
while :
do
    YOUR_EXE &
    inotifywait \
        -r YOUR_WATCHED_DIRECTORY \
        -e create,delete,modify \
    || break
    kill %1
    sleep 3
done

たとえば、package.json-ran プロジェクトの場合

"module"          : "./dist/server.mjs",
"scripts"         : {
    "build"  : "cd ./src && rollup -c ",
    "watch"  : "cd ./src && rollup -c -w",
    "start"  : "cd ./dist && node --trace-warnings --enable-source-maps ./server.mjs",
    "test"   : "trap 'kill %1' 1 2 3 6; while : ; do npm run start & inotifywait -r ./dist -e create,delete,modify || break; kill %1; sleep 3; done"
},
"dependencies"    : {

ここで、あるアクティビティで ( npm run watchsrc から dist にコンパイルする) を実行npm run testし、別のアクティビティで (サーバー ランナーとリスタータ) を実行でき./srcます。ファイルを編集すると、ビルダー プロセスが更新./distされ、テストのためにサーバーが再起動します。

于 2021-08-11T06:35:42.423 に答える