web-dev-qa-db-ja.com

小さなエンドレスループスクリプトをサーバー上で実行したままにしても大丈夫ですか?

ここですべてのシナリオを更新する必要があるようです。

ユーザーは、リモートの場所に同期するためにファイルサーバーから必要なものをすべて取得する必要がありますが、ファイルを移動するためのファイルサーバーに対する権限は制限されています。だからここに私の仕事があります:

ユーザーがデータを取得してリモートロケーションに同期するために使用できるツールを作成します。 DFSとサードパーティのツールはオプションではなく、独自に作成したコードである必要があり、すべてがバックグラウンドで実行されている必要があります。

これが私のやり方で、今は機能しています。私は3つのコンポーネントを作成しました:

** A **** VBSがユーザーPCに搭載され、データを取得するためのファイルブラウザをユーザーに提供するHTAアプリケーション。

** B **** HTAがデータパスをtxtファイルに書き込むことができる共有の場所。このテキストファイル内のパスは、最終的な場所へのソフトリンクとして作成されます。

** C ****ファイルサーバーの最終的な場所には、すべてのソフトリンクが保持されます。

基本的には次のように機能します。

ユーザーは、私が作成したHTAを使用してファイルサーバーからデータを選択します。共有場所の000.txtファイルに完全なデータパスを書き込みます。私の無限ループスクリプトはこの共有場所を監視します。この共有フォルダ内のユーザーが000.txtファイルを作成すると、別のスクリプトを呼び出してこの000.txt内のすべてのデータパスを読み取り、mklinkを使用して作成します。ユーザーが指定したパスに基づいてソフトリンクを作成し、ソフトリンクを最終的な場所に出力してから、000.txtファイルを削除します。この最終的な場所にあるすべてのソフトリンクは、スケジュールどおりの夜間にrobocopyによって同期されます。私のHTAアプリケーションにはもっと多くの機能が必要なので、それについて話す必要はありません。

ここでは誰もコーディングについて話していないので、無限ループコードを削除しました。このループスクリプトはWindowsで始まり、サービスとして実行されます。いつでも開始/停止できます。基本的にはその共有フォルダを監視するだけで、ユーザーがそこに000.txtファイルを作成すると、mklink.batを呼び出してソフトリンを作成し、ソフトリンクが作成されるとmklink.batによって000.txtが削除されます。タスクスケジューラの代わりに無限ループを使用する理由は、ユーザーがデータパスを送信した直後に、その最終的な場所で結果を確認する必要があるためです。タスクスケジューラの最小間隔は1分だと思ったので(@MikeAWoodは1秒になると言っていました。ありがとう!)、この2秒間隔の無限ループを作成して共有フォルダを監視しました。

私の質問は次のとおりです。

これは、フォルダを監視するために永遠にサーバー上で無限のループを実行するのに良い考えですか?

このスクリプトの実行中に、サーバー上のリソース使用量を監視しました。大きな消費は見られません...だから無害だと思いますよね?

タスクスケジューラが1秒間隔を処理できる場合、私の質問は解決されたと思います。ありがとうございました。

または、これを行うためのより良い方法や、私が行う方法についての意見がある場合。

4
Root Loop

これに対する一般的な代替手段として、スクリプトをタスクスケジューラに配置し、1分ごと、2分ごとなどにトリガーします。再起動やスクリプトエラーが発生してもプロセスが存続するため、これはより信頼性が高くなります。スケジュールされたタスクを使用すると、すでに述べたように、プロセスが再起動後も存続できるようになるだけでなく、 グループポリシー設定を介してタスクを多数のサーバーに展開できるようにする 現在のソリューションは両方のスケーラビリティの敵ですと信頼性。

あなたが話している実際のスクリプトに関しては、フランケンシュタインの怪物であるDFS-RやRobocopyを再発明しているようです。


DFS-R は、WindowsServerに組み込まれているスケーラブルで成熟したファイルレプリケーションツールです。この状況で使用できるかどうかを確認する必要があります。マイクロソフトは、同じことを行うスクリプトにこれまでに投入できたよりもはるかに多くのエンジニアリングの頭脳をDFS-Rに投入しました。

また、何らかの理由でDFS-Rを使用できない場合でも、 robocopy にはディレクトリをミラーリングする/mirスイッチがあります。なんらかの理由で本当にDFS-Rを使用できない場合は、少なくともスクリプトでこのようなものを使用してください。

23
MDMarra

あなたはあなたのアプローチについて尋ねたことで称賛されるべきです。あなたが持っている最初のアイデアで実行するのは簡単ですが、他の人と検証する方が良いです。

あなたのアプローチに関するいくつかの問題:

  • サーバーを再起動するたびに手動で再起動する必要があります
  • ソースと宛先にアクセスできる資格情報を使用してコンソールにログオンしたままにする必要があります
  • これを行うツール(DFS、スケジュールされたタスクなど)はすでにあります。

(これらの問題のいくつかは、サービスで述べたように対処できます。)とはいえ、直面している問題に対する特定の解決策の有効性を評価できるのはあなただけです。少なくとも今は選択肢があります。

9
uSlackr

無限ループを実行するよりも、それを行うためのより良い方法が確かにあります。無限ループは痛みであり、すべてのレベルですべての人にフラストレーションを引き起こします。しないでください。

5
SonalKhodiyar

なぜあなたが尋ねているのか興味があります。何人かの人々が代替の解決策を提供しました、そして、反応はあなたがそれをこのようにするように命じられたということであるようです。あなたは代替案を探していますか、それとも上司に戻ってこのようにして抗議する弾薬を探していますか?

このようにしない理由は、他の回答に列挙されています。

  • 障害、システムの再起動、またはあらゆる種類の処理エラーに耐えられないという点で、障害が発生しやすくなります。

  • 維持するには(ベンダーではなく)あなたの側の努力が必要です

  • この方法にはセキュリティリスクがあります

  • 比較的非効率的です

代替案に関しては、私もDFSで悪い経験をし、DoubleTakeレプリケーションを使用して素晴らしい結果を出しました。ただし、DFSの後続のリリースでは、DFSに関する問題が解決され、WANを介したDRレプリケーションに使用できるようになりました。

5
Arluin