14

「make」は、プログラミング プロジェクトの構築に役立つだけでなく、他の分野ではあまり使用されていないようです。

たとえば、多くのシェル スクリプトを Makefile として書き直して、独立した部分を (「make -jXX」を使用して) 並行して実行できるようにして、すべての CPU コアをビジー状態に保つことができます。シェル スクリプトで副作用のあるいくつかのタスクの順序を変更することを検討してください。

make / Makefile の珍しい使用法に関する興味深い話はありますか? 安価なジョブ スケジューラとして他のユーティリティを使用していますか?

4

7 に答える 7

21

Make の並列処理は、シェル スクリプトを作成する場合に特に便利です。ホストのセット全体の「稼働時間」を取得したい (または基本的に遅い操作を実行したい) とします。あなたはループでそれを行うことができます:

cat hosts | while read host; do echo "$host: $(ssh $host uptime)"; done

これは機能しますが、遅いです。サブシェルを生成することでこれを並列化できます。

cat hosts | while read host; do (echo "$host: $(ssh $host uptime)")&; done

しかし、今では生成するスレッドの数を制御できCTRL-Cず、すべてのスレッドをきれいに中断することはできません。

Make ソリューションは次のとおりです。これをファイル (例: showuptimes) に保存し、実行可能としてマークします。

#!/usr/bin/make -f

hosts:=$(shell cat)
all: ${hosts}

${hosts} %:
        @echo "$@: `ssh $@ uptime`"

.PHONY: ${hosts} all

今実行cat hosts | ./showuptimesすると、稼働時間が1つずつ出力されます。cat hosts | ./showuptimes -jそれらをすべて並行して実行します。呼び出し元は、並列化の度合いを直接制御する-jか ( )、システム負荷によって間接的に指定できます ( -l)。

于 2008-12-30T09:34:19.313 に答える
3

プログラミングでの明らかな用途以外に、ユーザー/グループの作成、パッケージのアップグレード/更新、構成ファイルのコピーなどのシステム設定を管理するために、サーバー上で反復的なタスクを実行するために Makefile が使用されているのを見てきました。また、Ruby ベースの環境でこれを行うために rake を見た (そして使用した) こともあります。

私が聞いた中で最も複雑な例は、構成管理ツールであるISConfです。Puppetの作者である Luke Kaniesのブログで聞いたことがあります。

于 2008-12-30T08:42:55.907 に答える
2

さまざまな 'make' に応じて、実行可能な makefile とシェル スクリプトを使用して、タスクの依存関係を乗り越えることができます。つまり、1 つの init スクリプトが 10 個のサービスを開始する必要があるシナリオで ... 次々に (つまり、サービス 2 が必要です)サービス 1 を開始前に起動して有効にする必要があります)、makefile を使用して簡単に実行できます。

多くの GNU/Linux パッケージャー (debian/rules など) がこれを利用しています。そうです、正しく行えば、make はプログラムをビルドするのと同じくらいプログラムを開始するのに適しています。

問題は、すべての人がビルド ツール チェーンをインストールしているわけではないことです。そのため、シェル スクリプトまたはバッチ ファイルは移植可能な (つまり「正しい」) アプローチのままです。

于 2008-12-30T08:51:31.457 に答える
1

私の想像力が不足しているということなのかもしれませんが、そのような用途のメイクファイルに十分な柔軟性を持たせることは困難です。makeこれを実現する「明白な」方法は、' ' コマンド ラインでマクロ値を指定することです。

make -f script.mk MACRO="list of files on which to operate"

これは、単純なシェル スクリプトよりも冗長であり、シェル ファイル名の展開を使用する簡単な機能が失われます。その回避策は次のとおりです。

make -f script.mk MACRO="$(echo *[io]*)"

(実行可能な) メイクファイルの奇妙な使用法として、なぜメイクファイルの先頭で #!/bin/make を使用しないかについて、この SO の質問を提供しますが、そこの目標は、異常なことを行うことではありません (古いソフトウェア ビルドを退屈にするだけです)。の異常な呼び出しメカニズムを使用するだけですmake

この手法を使用すると、呼び出しを次のように簡素化できます。

script.mk MACRO="$(echo *[io]*)"

これは、以下よりもさらに冗長です。

script *[io]*

scriptの呼び出しを行うように記述できると思いますmake。それはすべて依存します。そこから得られるマイレージが十分にあるとは思えません。YMMV。

于 2008-12-27T22:52:08.267 に答える
0

私の仕事では、奇妙なものを使用しています。依存関係が存在しないため、常にすべてを再構築します。

バッチファイルを使用した可能性もあります。

于 2008-12-27T18:19:35.383 に答える